2011-11-09 15 views
8

まだMySQLのロープを学んでいて、多対多を含む特定の選択を行う方法を見つけようとしています。私はテーブル名があまりにも一般的な場合は謝罪し、私はちょうどいくつかの自作練習をしていた。私は自己学習者であるために最善を尽くしています。MySQLの多対多選択

私は3つのテーブルの1つがリンクテーブルです。 「HTCとSamsungの両方の電話機を所有しているユーザーを表示する」(彼らは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

キーは、DISTINCTの電話番号のCOUNTを使用するGROUP BY/HAVINGにあります。カウントが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

@忍耐:受け入れられた答えのような "感謝"はありません。 :-) –

+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とSamsungの両方になることはできないため、行が返されることはありません。 –

+0

何も返されません。ジョーの答えははるかに良いです。 – enchance