2016-04-05 15 views
0

私はここに最初は私のテーブルです、私の現在のクエリに新しい列として追加さGROUP_CONCATでクエリを作成しようとしていますとのGROUP BYを除外しましょう:基本的に左サブクエリがnull結果

Users table 
+----+----------+--------------+ 
| id | username | date_created | 
+----+----------+--------------+ 
| 1 | user1 | 2000-03-16 | 
| 2 | user2 | 2001-05-14 | 
| 3 | user3 | 2002-01-13 | 
| 4 | user4 | 2003-03-14 | 
+----+----------+--------------+ 

Shifts table 
+----+------------+--------------+ 
| id | shift_name | date_created | 
+----+------------+--------------+ 
| 1 | shift1  | 2002-05-10 | 
| 2 | shift2  | 2002-07-11 | 
| 3 | shift3  | 2002-09-23 | 
+----+------------+--------------+ 

Accounts table 
+----+--------------+--------------+ 
| id | account_name | date_created | 
+----+--------------+--------------+ 
| 1 | account1  | 2001-05-01 | 
| 2 | account2  | 2001-05-02 | 
| 3 | account3  | 2001-05-03 | 
+----+--------------+--------------+ 

Shift Mapping table 
+----+---------+----------+------------+ 
| id | user_id | shift_id | account_id | 
+----+---------+----------+------------+ 
| 1 |  1 |  1 |   1 | 
| 2 |  1 |  2 |   2 | 
| 3 |  3 |  1 |   1 | 
+----+---------+----------+------------+ 

、私が欲しいですそのユーザーに接続されているすべてのシフトを示すカスタム列を持つすべてのユーザー(テーブルに表示する)を取得するクエリ(nullの結果が明らかにシフトアタッチがない場合)

ここにクエリがあります私はこれまでにやったことがあります:

SELECT users.id AS user_id, users.username, users.date_created, 
GROUP_CONCAT(DISTINCT (t.shift_name)) AS shifts 
FROM (`users`) 
LEFT JOIN 
    (SELECT s.shift_name, sm.user_id FROM shift_map sm 
    LEFT JOIN shifts s ON sm.shift_id = s.id) t 
ON users.id = t.user_id 
GROUP BY user_id 
ORDER BY `users`.`date_created` DESC; 

シフトを使用しているユーザーを取得するのに問題はありません。私の問題は、シフトがないユーザーがGROUP BY user_idによって引き起こされる1つの結果しか返さないということです。 GROUP BYを使用するか、シフトを添付してシフトを適用しないすべてのユーザーを返すにはどうすればよいですか?ありがとう。

+---------+----------+--------------+----------------+ 
| user_id | username | date_created |  shifts  | 
+---------+----------+--------------+----------------+ 
|  1 | user1 | 2000-03-16 | shift1,shift2 | 
|  2 | user2 | 2001-05-14 | (NULL)   | 
|  3 | user3 | 2002-01-13 | shift1   | 
|  4 | user4 | 2003-03-14 | (NULL)   | 
+---------+----------+--------------+----------------+ 

私のクエリで私の問題は、それが唯一のヌルシフトを有する唯一の1ユーザーを示すことである。ここでは

更新

は、私が見たいの例結果です。

+0

あなたが探している正確な出力を指定できますか? – Sanj

+0

こんにちは@Sanj例の結果について私の質問が更新されました。 – Cedric

答えて

0
SELECT users.id AS user_id, users.username, users.date_created, 
GROUP_CONCAT(DISTINCT (t.shift_name)) AS shifts 
FROM (`users`) 
LEFT JOIN 
    (SELECT s.shift_name, sm.user_id FROM mapping sm 
    LEFT JOIN shifts s ON sm.shift_id = s.id) t 
ON users.id = t.user_id 
GROUP BY username 
ORDER BY user_id 

+---------+----------+--------------+---------------+ 
| user_id | username | date_created | shifts  | 
+---------+----------+--------------+---------------+ 
|  1 | user1 | 2000-03-16 | shift1,shift2 | 
|  2 | user2 | 2001-03-16 | NULL   | 
|  3 | user3 | 2002-03-16 | shift1  | 
|  4 | user4 | 2003-03-16 | NULL   | 
+---------+----------+--------------+---------------+ 
0

私の悪い、私は単純なLEFT JOIN使用することができます。私は、クエリを複雑にしています

SELECT users.id AS user_id, users.username, users.date_created, 
GROUP_CONCAT(DISTINCT (shift.shift_name)) AS shifts 
FROM (`users`) 
LEFT JOIN shifts_map ON users.id = shifts_map.user_id 
LEFT JOIN shifts ON shifts_map.shift_id = shift.id 
GROUP BY user_id 
ORDER BY `users`.`date_created` DESC; 

、シンプルLEFT JOINはトリックを行うことができますことを忘れました。ありがとう。

関連する問題