MySQL, хранимая процедура, двойной СЧЕТЧИК не работает (w / SQLFiddle)

#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 ;
 

SQL Fiddle example

Комментарии:

1. Спасибо! Работает как шарм.