mysql - 组合这两个 mySQL 查询

标签 mysql sql subquery group-concat

此查询产生正确的答案:

SELECT users.*,
        SUM(overtime_list.shift_length) AS overtime_total,
        (SELECT GROUP_CONCAT(users_roles.role_ID) FROM users_roles WHERE users.user_ID = users_roles.user_ID) AS roles
    FROM availability_list
    INNER JOIN users
        ON users.user_ID = availability_list.user_ID
    INNER JOIN stations
        ON users.station_ID = stations.station_ID
    INNER JOIN overtime_list
        ON overtime_list.user_ID = users.user_ID
        AND overtime_list.date >= '$totalovertimedays'
    WHERE availability_list.date = '$date'
    AND availability_list.type = '$type'
    GROUP BY users.user_ID
    ORDER BY overtime_total ASC

输出:

 +----------+---------+----------------------------+------------------+
 |  user_ID | user    |   roles                    |  overtime_total  |
 +----------+---------+----------------------------+------------------+
 |        1 |   Smith |    1,2                     |        12        |
 +----------+---------+----------------------------+------------------+
 |        2 |   Jones |    1,2,3                   |        7         |
 +----------+---------+----------------------------+------------------+

这是期望的结果:

 +----------+---------+----------------------------+------------------+
 |  user_ID | user    |   roles                    |  overtime_total  |
 +----------+---------+----------------------------+------------------+
 |        1 |   Smith |    Admin, Staff            |        12        |
 +----------+---------+----------------------------+------------------+
 |        2 |   Jones |    Admin, Staff, Other     |        7         |
 +----------+---------+----------------------------+------------------+

这是我可以使用的联接,它似乎允许 group_concat 正确联接“admin、staff、other” - 但我无法弄清楚如何将其合并到上面的主查询中?

SELECT users.user_id, GROUP_CONCAT(roles.short_name  separator ', ') roles
FROM users
JOIN users_roles ON users.user_ID = users_roles.user_ID
JOIN roles ON users_roles.role_ID= users_roles.role_ID
GROUP BY users.user_ID

users_roles 表:

+----------+---------+
|  user_ID | role_ID |
+----------+---------+
|        1 |   1     |
+----------+---------+
|        2 |   1     |
+----------+---------+
|        2 |   2     |
+----------+---------+
|        2 |   3     |
+----------+---------+
|        1 |   3     |
+----------+---------+

角色表:

+----------+------------+
|  role_ID | short_name |
+----------+------------+
|        1 |   Admin    |
+----------+------------+
|        2 |   Super    |
+----------+------------+
|        3 |   Other    |
+----------+------------+

最佳答案

你可以尝试:

SELECT users.*,
        SUM(overtime_list.shift_length) AS overtime_total,
        (SELECT GROUP_CONCAT(roles.short_name) FROM users_roles 
         INNER JOIN roles ON user_roles.role_ID = roles.role_ID
         WHERE users.user_ID = users_roles.user_ID) AS roles
    FROM availability_list
    INNER JOIN users
        ON users.user_ID = availability_list.user_ID
    INNER JOIN stations
        ON users.station_ID = stations.station_ID
    INNER JOIN overtime_list
        ON overtime_list.user_ID = users.user_ID
        AND overtime_list.date >= '$totalovertimedays'
    WHERE availability_list.date = '$date'
    AND availability_list.type = '$type'
    GROUP BY users.user_ID
    ORDER BY overtime_total ASC

关于mysql - 组合这两个 mySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10085209/

相关文章:

php - 在 "IN CLAUSE"mysql php 中返回 null 或空字符串

php - 有没有办法只能获取两个日期之间的数据集?

php - 使用 php 和 mysql 从用户的所有好友检索用户个人资料数据

sql - 在应用程序中排序与在数据库中排序

sql - 如何获取具有相同 ID 但其他列中具有不同值的所有行?

MYSQL,Union 中的子查询引用

mysql - 来自 SQL 的 CakePHP 子查询

php - 如何使用动态单选按钮将数据从表单插入数据库..?

mysql - 选择 mysql 中另一列具有相同值的行

mysql - 从3个表中获取数据