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


MySQL query - single row in one table with multiple rows in another table

我有以下数据模型

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.然后通过传递对象阵列

有没有更有效/更好的方法来做到这一点?如有任何建议和建议,我们将不胜感激。

您只想要一个列表吗?

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更改为在where子句中使用显式join语法,而不是隐式联接