2017-01-17 206 views
2

如何將WHEREHAVING子句與GROUP_CONCAT結合使用,以便返回的數據將包含GROUP_CONCAT中包含ID的任意組合,其中不僅包含單個匹配,例如SELECT IN WHERE ID IN GROUP_CONCAT

SELECT p.id, 
p.title, 
GROUP_CONCAT(a.author_id) as 'aus' 
FROM publications p INNER JOIN authors a 
    ON p.publication_id = a.publication_id 
WHERE a.author_id = 2 
GROUP BY p.id,p.title 

將返回

id title  aus 
1  A   1,2,3 
2  B   1,2 
3  C   2 
4  D   2 
5  E   2,3 

,而不是僅僅3 & 4.

我雙方的a.author_id列嘗試的HAVINGWHERE條款的各種組合和GROUP_CONCAT產品。

+0

沒有group by子句的聚合函數? –

+0

啊對不起,我確實有,我只是簡化後發佈。已更新問題 –

+0

GROUP_CONCAT返回一個包含逗號分隔值列表的字段,而WHERE/HAVING檢查等於特定值的字段。您可以使用FIND_IN_SET,但這意味着它被迫檢查字段中的值而沒有索引的好處。 – Kickstart

回答

1

我會傾向於使用自聯接authors表,與第二聯接檢查的2

AUTHOR_ID猜測了一下,在您的數據,但像這樣

SELECT p.id, 
     p.title, 
     GROUP_CONCAT(a.author_id) as 'aus' 
FROM publications p 
INNER JOIN authors a ON p.publication_id = a.publication_id 
INNER JOIN authors a2 ON p.publication_id = a2.publication_id 
WHERE a2.author_id = 2 
GROUP BY p.id, 
     p.title 
+0

謝謝我測試了這個,它是最快的方法 –

3

您應該在HAVING子句中使用FIND_IN_SET。

SELECT p.id, p.title, GROUP_CONCAT(a.author_id) as aus 
FROM publications p INNER JOIN authors a 
    ON p.publication_id = a.publication_id 
WHERE 1 
GROUP BY p.id,p.title 
HAVING FIND_IN_SET('2', aus) > 0 
+0

這可行,但我接受Kickstarts的答案,因爲它更快 –

+0

這個答案適用於可能導致混淆的整數 - 部分原因是因爲FIND_IN_SET將字符串作爲兩個參數,並且可能認爲1處於設置狀態(3,4,2091,27) ,但是,它不認爲1是在2091年,所以它的工作原理。有人知道爲什麼 – fungusanthrax

相關問題