2

メインクエリをサブクエリと組み合わせる必要があります。

現在のクエリ(機能します):

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

($dateと$typeは、PHPによって入力された変数です)

これをサブクエリとして挿入したいクエリ:

SELECT role_ID, GROUP_CONCAT(users_roles.role_ID) AS roles FROM users
JOIN users_roles ON users.user_ID = users_roles.user_ID
GROUP BY users.users_ID

ここまで到達しましたが、GROUP BYを機能させることができないようであるため、正しくリストされていません。

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

available_listテーブル:

 +----------+---------+
 |  user_ID | user    |
 +----------+---------+
 |        1 |   Smith |
 +----------+---------+
 |        2 |   Jones |
 +----------+---------+
 |        3 |   Greg  |
 +----------+---------+

overtime_listテーブル:

 +----------+----------------+------------+
 |  date    | shift_length   |   user_ID  |
 +----------+----------------+------------+
 |  1/1/11  |   5            |      1     |
 +----------+---------+------+------------+
 |  1/2/11  |   5            |      2     |
 +----------+---------+------+------------+
 |  1/6/11  |   2            |      2     |
 +----------+---------+------+------------+
 |  1/8/11  |   5            |      1     |
 +----------+---------+------+------------+
 |  1/12/11 |   2            |      1     |
 +----------+---------+------+------------+

users_rolesテーブル:

 +----------+---------+
 |  user_ID | roles   |
 +----------+---------+
 |        1 |   Admin |
 +----------+---------+
 |        2 |   Staff |
 +----------+---------+
 |        2 |   Admin |
 +----------+---------+
 |        2 |   Super |
 +----------+---------+
 |        1 |   Other |
 +----------+---------+

したがって、結果は次のようになります。

 +----------+---------+----------------------------+------------------+
 |  user_ID | user    |   roles                    |  overtime_total  |
 +----------+---------+----------------------------+------------------+
 |        1 |   Smith |    Admin, Other            |        12        |
 +----------+---------+----------------------------+------------------+
 |        2 |   Jones |    Staff, Admin, Super     |        7         |
 +----------+---------+----------------------------+------------------+
 |        3 |   Greg  |                            |  null (or zero)  |
 +----------+---------+----------------------------+------------------+
4

3 に答える 3

2

これはうまくいくはずです-

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 type = '$type'
GROUP BY users.user_ID
ORDER BY overtime_total ASC
于 2012-04-09T11:22:21.333 に答える
0

私はあなたが望む結果を再考することを提案します。あなたはこれを求めています:

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

ただし、クエリがこれを返すのがより一般的です。

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

そうすれば、ユーザーごとに作成された行をまとめて、すべての役割を集めるのはかなり簡単です。user_ID(最初にで並べ替えて、user_IDがいつ変更されたかを検出すると、簡単に感じるかもしれません。)

于 2012-04-09T12:48:51.640 に答える
0

GROUP_CONCATを使用してすべてのロール名をグループ化することを主張する場合、これは機能する可能性があります。

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

この2番目のサブクエリを使用すると、このクエリの効率が以前よりもさらに低下するように思われるため、大量のシステムでこれを使用することには注意が必要です。1日に数千のエントリを読んでいるだけの場合、遅延に気付くことはありません。

于 2012-04-09T13:07:03.657 に答える