MySQL查询 - 一个表中的单行,另一个表中有多行

时间:2014-09-14 18:39:28

标签: php mysql sql aggregate-functions

我有以下数据模型

Table: User
USER ID
USER NAME

Table: Group
GROUP ID
GROUP NAME

Table: User Group
GROUP ID
USER ID

我正在尝试显示一个包含所有组名和关联用户的屏幕 - 前端是PHP

我的查询如下 -

`SELECT a.group_id,
        a.group_name,
        GROUP_CONCAT(g.user_id) AS user_ids,
        GROUP_CONCAT(u.user_fname) AS user_names
 FROM   group a, user_group g, user u
 WHERE  a.group_id = g.group_id
 AND    g.user_id = u.user_id
 GROUP BY a.group_id`

我的问题:正如您从上面的查询中看到的那样 - 我必须有两个表示用户ID和用户名的连接字符串列表。这在我必须要成为PHP的头痛 1.将连接的字符串分解为数组 2.在两个数组中运行循环并从中构造User对象 3.然后通过

传递对象数组

有更高效/更好的方法吗?任何建议,指示将不胜感激。

1 个答案:

答案 0 :(得分:1)

你只想要一个清单吗?

SELECT g.group_id, g.group_name,
       GROUP_CONCAT(g.user_id, ':', u.user_fname) AS names_and_ids
FROM group g join
     user_group ug
     on g.group_id = ug.group_id join
     user u
     on ug.user_id = u.user_id
GROUP BY g.group_id, g.group_name;

请注意以下更改:

  • 我添加了group by,因此每组获得一行。
  • 我将别名更改为表名的缩写,因此查询更容易阅读。
  • 我修改了group_concat()以在一个列表中包含用户ID和用户名。
  • 我将join更改为使用显式join语法,而不是where子句中的隐式连接。