【问题标题】:MySQL query - single row in one table with multiple rows in another tableMySQL查询 - 一个表中的单行,另一个表中的多行
【发布时间】:2014-11-08 07:27:14
【问题描述】:

我有以下数据模型

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. 循环遍历两个数组并从中构造用户对象 3.然后将对象数组传递过来

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

【问题讨论】:

    标签: php mysql sql aggregate-functions


    【解决方案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 子句中的隐式连接。

    【讨论】:

    • 谢谢 - 是的,我有一个 group by 子句,我只是错过了输入。如果我按照您的建议进行操作,我将不得不在 PHP 中拆分所有连接的用户 ID 和名称。我希望有某种方法可以从 MySQL 中返回关联的数组。也许我只是希望太多 - 如果我没有看到任何更好的回应,我会接受你的
    • 有一个叫做mysqli_fetch_assoc()的东西。也许这就是你想要的。
    猜你喜欢
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多