0

次のテーブルがあります。

+---------+    +-----------+     +---------+
| USER    |    | USER_BOX  |     | BOX     |
| id      |    | user_id   |     | id      |
| name    |    | box_id    |     | name    |
|         |    |           |     |         |
+---------+    +-----------+     +---------+

私がやりたいことは、すべてのボックスをリストするように DB にクエリを実行することですが、ユーザーと関係のあるすべてのボックスを最初に 1回だけリストすることです。私は立ち往生しており、MySql がそのようなクエリをサポートしているかどうかさえわかりません。

        USER                    BOX                 USER_BOX
+--------|--------+      +--------|--------+   +--------|--------+
|   0    | Jonh   |      |   0    | Boobox |   |   0    |    4   |
+--------|--------+      |   1    | RedBox |   |   0    |    3   | 
                         |   2    | GGbox  |   +--------|--------+
                         |   3    | OKbox  |   
                         |   4    | boxy   |   
                         +--------|--------+

結果のクエリは次を返す必要があります。

4 - boxy
3 - Okbox
0 - Boobox    
1 - RedBox
2 - GGbox

編集:ユーザーごとにクエリを実行できるようにするため、大きなリストでユーザーボックスを簡単に見つけることができます。

4

3 に答える 3

1
SELECT b.id, b.name
FROM BOX b
LEFT JOIN (
    USER_BOX ub
    JOIN USER u ON (user_id = u.id)
) ON (box_id = b.id)
ORDER BY
    u.id IS NULL,
    b.id DESC

http://sqlfiddle.com/#!2/a4f304/4/0

編集: 実際には、に参加する必要はありませんUSER
http://sqlfiddle.com/#!2/a4f304/7/0

于 2013-09-05T18:03:21.310 に答える
0

このようなもの:

SELECT a.id, a.name
FROM BOX AS a
LEFT JOIN USER_BOX AS b
 ON a.id = b.box_id
ORDER BY CASE WHEN b.box_id IS NOT NULL THEN 0 ELSE 1 END
      ,a.id
于 2013-09-05T17:56:46.290 に答える
0
SELECT * FROM BOX
WHERE box_id IN (SELECT box_id FROM USER_BOX)
UNION ALL
SELECT * FROM BOX
WHERE box_id NOT IN (SELECT box_id FROM USER_BOX)
于 2013-09-05T18:06:42.810 に答える