复杂的Sql连接查询问题

时间:2013-01-01 00:24:15

标签: mysql sql

我有两个表需要以特定的方式组合。我需要在一个表中显示一次信息,但我需要下表中的信息来返回它拥有的每个匹配数据。这是我的例子

用户


| id | name |
-------------
| 1  | mike |
| 2  | john |
| 3  | bill |
-------------

-----------------
| uid | subject | 
-----------------
| 1   | math    |
| 1   | English |
| 2   | math    |
| 3   | math    |
| 3   | English |
-----------------

预期结果

--------------------
|name   | mike      |
---------------------
|subject| math      |
|       | English   |
---------------------

--------------------
|name   |  subject  |
---------------------
|mike   | math      |
|       | English   |
---------------------

这是我当前的查询

SELECT user.name, class.subject
FROM user
join class on class.uid = user.id
WHERE (user.name like '%mike%')

返回

--------------------
|name   |  subject  |
---------------------
|mike   | math      |
|mike   | English   |
---------------------

但我想删除所有名称重复项。任何人都可以帮助解决这个问题

2 个答案:

答案 0 :(得分:2)

您可以将值连接到带有连接类型函数的分隔字符串中......例如

Select u.name, (
      select
      GROUP_CONCAT(c.subject) FROM classes c where u.id = c.uid
    ) As subjects
    From user u

所以你最终得到了

--------------------
|name   |  subjects  |
---------------------
|mike   | math, English |

答案 1 :(得分:1)

set @lastname = null;
select case when name = @lastname
            then ""
            else @lastname := name
       end name,
       subject
from (select name, subject
      from user
      join class on id = uid
      where name like '%mike%'
      order by name) x

FIDDLE

然而,正如其他人在评论中指出的那样,这通常是在应用程序代码中完成的,而不是在SQL中完成的。在处理行的循环中,只需检查名称是否与前一个名称相同,并将该表字段留空。或者使用网格小部件为您自动分组。