需要帮助mySQL查询

时间:2011-06-27 20:16:33

标签: mysql sql

我有以下查询(并且工作正常):

   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 个答案:

答案 0 :(得分:2)

SQL IN子句不允许单个变量表示值列表。该查询按原样只能作为动态SQL运行 - 在任何数据库上。即使是动态运行,SQL也只会将此示例解释为单个字符串。

其次,由于使用OUTER JOIN(在此示例中为LEFT),标准的放置可能会极大地影响返回的结果。在JOIN的ON子句中指定条件将在 JOIN之前应用标准;使用WHERE子句意味着在 JOIN之后应用了条件,这可能意味着您不想包含其他记录。

您可以改为使用FIND_IN_SET function

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标准中

.. vs:

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 :(得分:1)

IN()需要一个行集,但是你提供了一个字符串,所以这不起作用。 请改用函数FIND_IN_SET()。