Нужна помощь с запросом MySQL - PullRequest
0 голосов
/ 28 июня 2011

У меня следующий запрос (и он отлично работает):

   SELECT cd.id AS card_id,
          ct.id AS category_id,
          COUNT(cc.user_id) AS cnt
     FROM uiCards AS cd
     JOIN uiCardCategories AS ct USING (project_id)
LEFT JOIN uiCategories2Cards AS cc ON (cc.card_id = cd.id AND cc.stack_id = ct.id)
    WHERE cd.project_id = $projID
 GROUP BY cd.id, ct.id
 ORDER BY cd.id, ct.id

У меня также есть строка чисел:

$exclude = '100,122,345';

Мне нужно изменить строку, исключить результатынайдено в строке.Поэтому я добавил:

AND cc.user_id NOT IN ($exclude)

ниже WHERE

WHERE cd.project_id = $projID
  AND cc.user_id NOT IN ($exclude)

Это не сработало, поэтому я попытался изменить больше, и весь запрос рухнул на меня.


ОБНОВЛЕНИЕ:

Я понял!Я добавил цитаты:

AND (FIND_IN_SET(cc.user_id, '$exclude') = 0 OR FIND_IN_SET(cc.user_id, '$exclude') IS NULL) 

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

Предложение SQL IN не позволяет одной переменной представлять список значений.Запрос, как есть, может выполняться только как динамический SQL - для любой базы данных.Даже при динамическом запуске SQL будет интерпретировать этот пример только как одну строку.

Во-вторых, из-за использования OUTER JOIN (в этом примере LEFT) размещение критериев может существенно повлиять на возвращаемые результаты.При указании критериев в предложении ON для JOIN будут применяться критерии до создания JOIN;использование предложения WHERE означает, что критерии применяются после JOIN, что может означать дополнительные записи, которые вы не хотите включать.

Вместо этого вы можете использовать функцию FIND_IN_SET :

WHERE cd.project_id = $projID
  AND (FIND_IN_SET(cc.user_id, $excluded) = 0 OR 
       FIND_IN_SET(cc.user_id, $excluded) IS NULL)

.. против критериев ЛЕВОГО СОЕДИНЕНИЯ:

LEFT JOIN uiCategories2Cards AS cc ON cc.card_id = cd.id 
                                  AND cc.stack_id = ct.id
                                  AND FIND_IN_SET(cc.user_id, $excluded) = 0
1 голос
/ 28 июня 2011

IN () требует набора строк, но вы предоставляете строку, поэтому это не сработает. Вместо этого используйте функцию FIND_IN_SET ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...