我有三张桌子
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
任何帮助,不胜感激! (也许还有一种更优雅的方式来配合)
最佳答案
如果我理解正确,则希望获取组4中的所有对象,以及这些对象所在的所有组。您想要在group_ref表上进行两次JOIN,一次进行过滤(常规JOIN),一次进行相关组的创建(LEFT)加入)。
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
关于mysql - GROUP BY,GROUP_CONCAT,CONCAT以及如何选择,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9457077/