2011-11-09 21 views
8

Ancora imparando le corde MySQL e sto cercando di scoprire come fare una selezione specifica che coinvolge molti a molti. Mi scuso se i nomi dei tavoli sono troppo generici, stavo facendo degli esercizi fatti da solo. Faccio del mio meglio per essere un autodidatta.MySQL Many-To-Many Select

Ho 3 tabelle una delle quali è una tabella di collegamento. Come scrivo la dichiarazione che dice "Mostra quali utenti possiedono sia un telefono HTC che un telefono Samsung" (possiedono 2 telefoni). Immagino che la risposta sia nell'istruzione WHERE ma non riesco a capire come esprimerla.

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

risposta

12

La chiave è in GROUP BY/HAVING utilizzando un COUNT di nomi di telefono DISTINCT. Quando il conteggio è 2, saprai che l'utente ha entrambi i telefoni.

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

Grazie mille Joe! – enchance

+2

@enchance: Niente dice "grazie" come risposta accettata. :-) –

+0

Hai capito, amico. Inoltre, invece di chiamare la tabella 'mark5' lo hai trasformato in m5, non sapevo che puoi farlo solo scrivendolo dopo il nome della tabella. È l'equivalente di AS che è per i nomi delle colonne? – enchance

0

La risposta Penso che si sta cercando è:

"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'" 

credo che sarà rispondere alle vostre domande in cui si sta tirando i nomi distinto da Mark5 e si uniscano alle altre tabelle su quei valori specifici in cui il nome del telefono è HTC o Samsung

+3

Sono abbastanza sicuro che non puoi usare && al posto di AND, ma potrei sbagliarmi. Indipendentemente da ciò, che non restituirà mai alcuna riga perché un nome di telefono non può essere sia HTC che Samsung allo stesso tempo. –

+0

Non restituisce nulla. La risposta di Joe è molto meglio. – enchance