SQL查询,其中两列的组合是唯一的(带子查询)

时间:2016-08-13 17:19:35

标签: mysql sql

我有两张桌子;一个有联系信息,另一个有组列表。例如:

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。我现在正处于项目的规划阶段,所以如果我需要更改数据库模式以更好地支持我可以做到的。

提前致谢。

3 个答案:

答案 0 :(得分:2)

是的,使用:first-of-type { //left styles here } :nth-of-type(2) { //middle styles here } :last-of-type { //right styles here } joinin可以做到这一点。

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

我是第一次发布海报,无法找到答案的方法。我错过了什么,或者只是提供奖励的问题?