2016-09-19 98 views
0

如何在IN子句中使用来自LEFT JOIN的结果?MySQL - 使用来自LEFT JOIN的IN子句检查多个值结果

这是我的查询到目前为止:

SELECT 
n.id, 
n.title, 
n.public, 
CAST(GROUP_CONCAT(DISTINCT ngm.members_group_id) AS CHAR(1000)) AS `news_groups_text`, 
GROUP_CONCAT(DISTINCT ngm.members_group_id) AS `news_groups` 

FROM news n 

LEFT JOIN news_groups_map ngm ON ngm.news_id = n.id 

WHERE public=0 

GROUP BY n.id 

它返回表单结果

id title public news_groups_text news_groups 
159 Test 0   5,6,4    (BLOB) 5 bytes 

我怎样才能添加,检查文章属于哪个群体的条款?例如,我有4和6组,我需要返回所有在news_groups中至少有一个的结果。

我试图去检查一组与IN条款,加入这一到WHERE条款:

WHERE public=0 AND 
4 IN (GROUP_CONCAT(DISTINCT ngm.members_group_id)) 

但后来我得到错误[Err] 1111 - Invalid use of group function

我如何通过滤除文章群体?如果我至少可以检查一个组,我可以将它们链接起来。AND

谢谢!

+0

我认为在这种情况下'IN'语句与'='所做的相同。另外,你确定连接的函数会返回值'4'吗?我怀疑你在这里丢失了一些东西。 –

+0

GROUP BY无效,不会在较新的MySQL版本上执行。一般的GROUP BY规则说:如果指定了GROUP BY子句,SELECT列表中的每个列引用必须标识一个分组列或者是一个set函数的参数。 – jarlh

回答

2

我认为你正在寻找FIND_IN_SET

FIND_IN_SET(4, news_groups_text) 

注意:这只能通过使用原始查询作为子查询外部查询使用。

但它是更自然放置条件HAVING子句中:

HAVING COUNT(CASE WHEN news_groups_text=4 THEN 1 END) > 0 
+0

具有'HAVING'子句的'FIND_IN_SET'似乎适用于单个值。 '='操作符将不起作用,因为每篇文章可以附加多个组。谢谢! – Giedrius

0

MySQL中做到这一点,最简单的方法是GROUP BY后使用HAVING条款。最简单的这样的句子是:

HAVING MAX(ngm.members_group_id = 4) > 0