2013-09-05 27 views
0

很多爲了我有以下表格:許多由relantionship

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

我想要做的就是查詢數據庫,以列出所有箱子,但必須有與用戶關係的所有盒上市第一次,只有一次。我卡住了,我甚至不確定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

這個問題似乎是題外話,因爲似乎沒有找到一個解決辦法的努力。 – Itay

+0

好點,展示你到目前爲止所嘗試過的。 –

+0

我很尷尬地展示我所做的,特別是因爲它根本沒有工作。 – localhost

回答

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

+0

哈!你的解決方案更好。 +1 Pills;) – 2013-09-05 18:07:32

+0

如果有多個用戶框關係,它仍將被打印:http://sqlfiddle.com/#!2/edda0/1。我會更新這個問題來強調。 – localhost

+0

@localhost只需使用'SELECT DISTINCT' –

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 
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)