我有以下查询(并且工作正常):
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)
答案 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()。