2011-11-09 41 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