2012-02-26 7 views
0

を選択するために、私はそうはすべてのオブジェクトは、n個のグループにすることができ、3つのテーブルGROUP BY、GROUP_CONCAT、CONCAT、どのよう

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

を得ました。私は、オブジェクトのリストと、そのリストの一つのフィールドを表示したい

は、オブジェクトが入っているグループであるので、ここで私が思い付いたものです:。実際に動作し、私が作成できる

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 

すべてのヘルプは大歓迎します! (多分concatのthingyのためのよりエレガントな方法があります)

+2

"は動作していません"は説明ではありません – zerkms

答えて

1

私が正しくあなたを理解していれば、あなたはグループ4内のすべてのオブジェクトとそれらのオブジェクトがでているすべてのグループを取得したいあなたは。 group_refテーブルでJOINを2回、フィルタリング(通常JOIN)、関連グループ取得(LEFT JOIN)を1回行います。

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

0

これは機能しますか?

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

これは、1つのグループにあるオブジェクトを表示する必要があります。

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