#mysql #sql #stored-procedures
#mysql #sql #хранимые процедуры
Вопрос:
У меня есть этот SQL
SELECT COUNT( DISTINCT `ct`.`content_type_id`) AS `type_count`
, COUNT(`content_id`) AS `content_count`
FROM `user_to_content` `uc`
JOIN `content` `c` USING (`content_id`)
JOIN `content_type` `ct` USING (`content_type_id`)
WHERE `user_id`= 1;
Я пытаюсь получить 2 числа из одной таблицы одновременно.
Этот файл SQLFiddle показывает, что приведенный выше SQL работает…
Однако я не могу заставить работать версию SP. Кажется, я не могу заставить SQLFiddle работать с SP (возможно, кто-то может показать мне, как), так что вот SP в pastebin…
В любом случае, SP не будет «компилироваться» со второй командой COUNT …
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 24
Это строка 24
DECLARE $type_count TINYINT(1) UNSIGNED DEFAULT 0;
Моя работа над этим — слишком дважды вызывать СЧЕТЧИК в таблице. Я бы предпочел этого не делать.
Комментарии:
1. Глупый вопрос, но что произойдет, если вы попробуете сделать это без знака доллара? Этот учебник может помочь: forums.mysql.com/read.php?98 ,358569
2. ‘$’ — это просто мой способ отслеживать внутренние переменные в SP. Не более того. Они не требуются ни MySQL, ни SP.
Ответ №1:
Вот пример с некоторыми изменениями:
DELIMITER $
CREATE PROCEDURE `SP_system_content_badges`
( IN `$user_id` INT(10) UNSIGNED
, IN `$content_id` INT(10) UNSIGNED
, IN `$content_type_id` INT(10) UNSIGNED
)
BEGIN
-- DECLARE $type_count TINYINT(1) UNSIGNED DEFAULT 0;
-- DECLARE $content_count TINYINT(1) UNSIGNED DEFAULT 0;
DECLARE `$type_count` INT UNSIGNED DEFAULT 0;
DECLARE `$content_count` INT UNSIGNED DEFAULT 0;
-- How many pieces of content has this person consumed
-- Is there 4 unique kinds as well
-- SELECT COUNT( DISTINCT `ct`.`content_type_id`) INTO $type_count
-- , COUNT(`content_id`) INTO $content_count
SELECT COUNT(DISTINCT `ct`.`content_type_id`), COUNT(`c`.`content_id`)
INTO `$type_count`, `$content_count`
FROM `user_to_content` `uc`
JOIN `content` `c` USING (`content_id`)
JOIN `content_type` `ct` USING (`content_type_id`)
WHERE `user_id`= `$user_id`;
SELECT `$type_count` 'TYPE_COUNT', `$content_count` 'CONTENT_COUNT';
END$
DELIMITER ;
Комментарии:
1. Спасибо! Работает как шарм.