2012-02-26 92 views
0

我有三個表GROUP BY,GROUP_CONCAT,CONCAT以及如何選擇

objects  id, field1, field2, ... 
groups  id, title, color 
group_ref oid, gid 

所以每一個對象可以在N組。

我要顯示對象的列表,並且列表中的一個領域是集團的目標是在所以這是我想出了:

SELECT o.id, 
CONCAT_WS("||", GROUP_CONCAT(gx.gid separator "|"), GROUP_CONCAT(gr.title, "#", gr.color separator "|")) AS groups 
FROM objects AS o 
LEFT JOIN group_ref AS gx ON o.id = gx.oid 
LEFT JOIN groups AS gr ON gx.gid = gr.id 
WHERE 1 
GROUP BY o.id 

的實際工作,我可以創建(串聯)組字段中所需的接口。

問題是:如何選擇僅在一個特定組中的對象(例如,gid = 4)?

這僅得到結果的一部分:

WHERE gr.id = 4 

HAVING gr.id = 4 

任何幫助,不勝感激! (也許還有一種更優雅的連接方式)

+2

「不工作」不是一種解釋 – zerkms 2012-02-26 21:00:37

回答

1

如果我理解正確的話,你想獲得第4組和所有對象的所有組的對象是你想要加入group_ref表兩次,一次過濾(常規JOIN),一次獲取相關組(LEFT JOIN)。

SELECT o.id, 
CONCAT_WS("||", GROUP_CONCAT(gx.gid separator "|"), 
GROUP_CONCAT(gr.title, "#", gr.color separator "|")) AS groups 
FROM objects AS o 
JOIN group_ref AS gfilter ON o.id = gfilter.oid AND gfilter.gid=4 
LEFT JOIN group_ref AS gx ON o.id = gx.oid 
LEFT JOIN groups AS gr ON gx.gid = gr.id 
WHERE 1 
GROUP BY o.id 
+0

當我看到它時,我知道它有效。當然!謝謝。 – Mike 2012-02-26 23:36:22

0

這是行不通的?

WHERE gr.id = 4 
GROUP BY o.id 
HAVING COUNT(*) = 1 
0

這應該顯示在只有一組對象:

SELECT o.id, 
CONCAT_WS("||", GROUP_CONCAT(gx.gid separator "|"), 
    GROUP_CONCAT(gr.title, "#", gr.color separator "|")) AS groups 
FROM objects AS o 
LEFT JOIN group_ref AS gx ON o.id = gx.oid 
LEFT JOIN groups AS gr ON gx.gid = gr.id 
GROUP BY o.id 
HAVING COUNT(DISTINCT gx.gid) = 1 
+0

看起來很有意思,但那讓我只有一(1)組中的所有對象。我需要獲取特定組中的所有對象(例如gid 4)。 – Mike 2012-02-26 22:22:12