2011-11-09 37 views
8

不斷學習MySQL的繩索,我試圖找出如何做一個具體的選擇涉及多對多。我很抱歉,如果表名太泛化,我只是在做一些自制的練習。我盡我所能成爲一名自學者。MySQL多對多選擇

我有3個表格之一是一個鏈接表。我如何撰寫說明的聲明「顯示哪些用戶同時擁有HTC和三星手機」(他們擁有2部手機)。我猜測答案是在WHERE聲明中,但我無法弄清楚如何說出來。

-- Table: mark3 
+---------+-----------+ 
| phoneid | name  | 
+---------+-----------+ 
|  1 | HTC  | 
|  2 | Nokia  | 
|  3 | Samsung | 
|  4 | Motorolla | 
+---------+-----------+ 

-- Table: mark4 
+------+---------+ 
| uid | phoneid | 
+------+---------+ 
| 1 |  1 | 
| 1 |  2 | 
| 2 |  1 | 
| 2 |  3 | 
| 2 |  4 | 
| 3 |  1 | 
| 3 |  3 | 
+------+---------+ 

-- Table: mark5 
+------+-------+ 
| uid | name | 
+------+-------+ 
| 1 | John | 
| 2 | Paul | 
| 3 | Peter | 
+------+-------+ 

回答

12

關鍵在GROUP BY/HAVING中使用COUNT個DISTINCT電話名稱。當計數是2時,您將知道用戶有兩個電話。

SELECT m5.name 
    FROM mark5 m5 
     INNER JOIN mark4 m4 
      ON m5.uid = m4.uid 
     INNER JOIN mark3 m3 
      ON m4.phoneid = m3.phoneid 
    WHERE m3.name in ('HTC', 'Samsung') 
    GROUP BY m5.name 
    HAVING COUNT(DISTINCT m3.name) = 2; 
+0

非常感謝喬! – enchance

+2

@enchance:沒有什麼像接受的答案那樣說「謝謝」。 :-) –

+0

你明白了,夥計。另外,不是調用表格'mark5',而是將它編入m5中,我不知道只要將它寫在表名後面就可以做到。這是相當於列名的AS嗎? – enchance

0

我認爲你正在尋找的答案是:

"SELECT DISTINCT mark5.name FROM mark5 JOIN mark4 ON (mark4.uid = mark5.uid) JOIN mark3 ON (mark3.phoneid = mark4.phoneid) WHERE mark3.name = 'HTC' && mark3.name = 'Samsung'" 

我相信一定會回答你的問題,你是從mark5拉動不同的名稱,並在這些特定的值,其中加入您的其他表手機名稱是HTC或三星

+3

我很確定你不能用&&代替AND,但我可能是錯的。無論如何,這將永遠不會返回任何行,因爲手機名稱不能同時是HTC和三星。 –

+0

不返回任何東西。喬的回答好多了。 – enchance