2016-09-19 35 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