3

SQL の質問にタイトルを付けるのは難しいです。これをより適切に説明する方法を考えられる場合は、自由に変更してください。

私は非常に典型的なセットアップを持っています: 3 つのテーブルusers、、、groupsgroup_members

ここにSQLフィドルがあります:http://sqlfiddle.com/#!2/23712/1

私が知りたいのは、どのグループがどのユーザーであるかです。

だから、私は走っています:

SELECT u.id, u.firstname, u.lastname,
GROUP_CONCAT(m.group_id) as groups
FROM group_members m, users u
WHERE m.user_id = u.id
GROUP BY id
ORDER BY u.lastname ASC

これはクールで、ユーザー名とそのユーザーが所属しているグループが表示されます。

私の問題は、もちろん WHERE ビットが一致しないため、どのグループにも属していないユーザーが表示されないことです。

どのグループにも属していないユーザーを返すにはどうすればよいですか? (上記の SQL Fiddle では、Zack Jones の別の行が必要で、彼がグループ 0、または NULL か何かに属していることを示しています!)

4

6 に答える 6

4

一致するものが利用できるかどうかわからないテーブルでは、LEFTJOINを使用する必要があります。あなたの場合、group_membersテーブルに左参加する必要があります。

SELECT u.id,
       u.firstname,
       u.lastname,
       GROUP_CONCAT(m.group_id) AS groups
FROM   users
       LEFT JOIN group_members
              ON users.id = group_members.user_id
GROUP  BY id
ORDER  BY users.lastname ASC
于 2012-08-29T14:46:18.570 に答える
4
SELECT
    u.id, u.firstname, u.lastname, GROUP_CONCAT(m.group_id) as groups
FROM
    users u
    LEFT JOIN
    group_members m ON  m.user_id = u.id
GROUP BY u.id, u.firstname, u.lastname
ORDER BY u.lastname ASC

暗黙的ではなく、明示的なJOINを使用します-一般的にWHEREJOINS。この場合、LEFTOUTERJOINを使用してください

また、MySQLGROUPBY拡張機能に依存しないでください。常に期待どおりに機能するとは限りません。

于 2012-08-29T14:46:44.353 に答える
4

でテーブルのを使用する必要がLEFT JOINあります。usersgroup_members

SELECT u.id, 
  u.firstname, 
  u.lastname, 
  GROUP_CONCAT(m.group_id) as groups 
FROM users u
LEFT JOIN group_members m 
  ON u.id = m.user_id
GROUP BY u.id, u.firstname, 
  u.lastname
ORDER BY u.lastname ASC

SQL Fiddle with Demoを参照してください

または、することができRIGHT JOIN group_membersますusers

SELECT u.id, 
  u.firstname, 
  u.lastname, 
  GROUP_CONCAT(m.group_id) as groups 
FROM group_members m
RIGHT JOIN users u
  ON m.user_id = u.id 
GROUP BY id, u.firstname, 
  u.lastname
ORDER BY u.lastname ASC

SQL Fiddle with Demoを参照してください

于 2012-08-29T14:49:15.233 に答える
1
SELECT u.id, u.firstname, u.lastname,
GROUP_CONCAT(m.group_id) as groups
FROM users u
LEFT JOIN group_members m on m.user_id = u.id
GROUP BY u.id
ORDER BY u.lastname ASC
于 2012-08-29T14:47:14.047 に答える
1

このような場合、外部結合が役立ちます。左外部結合を行うために、usersとgroup_membersを入れ替えました。where句でJOINを実行しないようにすることも検討する必要があります。

SELECT u.id, u.firstname, u.lastname, GROUP_CONCAT(m.group_id) as groups 
FROM users u LEFT OUTER JOIN group_members m 
ON m.user_id = u.id 
GROUP BY id 
ORDER BY u.lastname ASC
于 2012-08-29T14:47:38.897 に答える
1
SELECT 
        u.id, 
        u.firstname, 
        u.lastname,
        m.groups
FROM users u
LEFT JOIN (
            SELECT  user_id,
                    GROUP_CONCAT(m.group_id) as groups  
            FROM group_members
           ) as m on m.user_id = u.id
WHERE m.user_id = u.id
GROUP BY id
ORDER BY u.lastname ASC

クエリでは、デカルト積を使用しています。メソッドの使用は避けてください。望ましくない結果が多すぎるため、代わりに結合をはるかに高速に使用してください。

于 2012-08-29T14:51:41.563 に答える