我有两张桌子;一个有联系信息,另一个有组列表。例如:
clients
+-------------+---------------+-------------+------------+
| client_id | client_name | group1_id | group2_id |
+-------------+---------------+-------------+------------+
| 283 | John Smith | 1 | null |
| 284 | Jane Smith | 1 | 2 |
| 285 | Tim Johnson | 1 | null |
| 286 | Peter Guy | null | null |
+-------------+---------------+-------------+------------+
groups
+------------+----------------+
| group_id | group_name |
+------------+----------------+
| 1 | Smith Group |
| 2 | Johnson Group |
+------------+----------------+
如果不明显,group1_id和group2_id是进入组表的外键。
我需要编写一个查询来选择客户端名称和组名。如果客户端是两个组的成员(如Jane Smith),则它们应在输出中出现两次。理想情况下,每一行应输出组名,后跟括号中的客户端名称,所有结果应按字母顺序排序。所以对于上面的表格,输出应该是:
John Smith (Jane Smith)
Johnson Group (Jane Smith)
Johnson Group (Tim Johnson)
Smith Group (John Smith)
使用单个SQL查询可以实现吗?
我正在使用MySQL。我现在正处于项目的规划阶段,所以如果我需要更改数据库模式以更好地支持我可以做到的。
提前致谢。
答案 0 :(得分:2)
是的,使用:first-of-type {
//left styles here
}
:nth-of-type(2) {
//middle styles here
}
:last-of-type {
//right styles here
}
join
或in
可以做到这一点。
or
但是,我建议调查select c.client_name, g.group_name
from clients c
join groups g on g.group_id in (c.group1_id, c.group2_id)
。更改表结构以包含名为database normalization
的第3个表最好作为联结表工作。然后你最终得到这样的东西:
ClientGroup
然后你可以再一次clients (client_id, client_name)
groups (group_id, group_name)
clientgroup (client_id, group_id)
表格:
join
答案 1 :(得分:0)
如果您想在客户端匹配两次时输入两行,请使用or
:
select c.client_name, g.group_name
from clients c join
groups g
on g.group_id = c.group1_id or g.group_id = c.group2_id;
这会将结果格式化为两列,而不是将组名称放在括号中的字符串。
答案 2 :(得分:0)
感谢sgeddes和Gordon提供快速有用的答案。我想我需要一个连接,但是在获得正确的语法方面遇到了麻烦(我之前没有使用过连接)。看到其他人给出答案后,最终结果非常明显!
在括号中使用排序和客户名称,最终查询为:
SELECT client_id, CONCAT(g.group_name, " (", c.client_name, ")") new_col
FROM clients c
JOIN groups g on g.group_id IN (c.group1_id, c.group2_id)
ORDER BY g.group_id, c.client_name ASC
我是第一次发布海报,无法找到答案的方法。我错过了什么,或者只是提供奖励的问题?