2011-11-09 13 views
8

Todavía estoy aprendiendo las cuerdas MySQL y estoy tratando de descubrir cómo hacer una selección específica que involucra muchas-a-muchas. Me disculpo si los nombres de las tablas son demasiado genéricos, solo estaba haciendo algunos ejercicios hechos por mí mismo. Hago todo lo posible para ser un autodidacta.MySQL Many-To-Many Select

Tengo 3 tablas, una de las cuales es una tabla de enlaces. Cómo escribo la declaración que dice "Mostrar qué usuarios poseen un HTC y un teléfono Samsung" (tienen 2 teléfonos). Supongo que la respuesta está en la declaración WHERE, pero no puedo encontrar la manera de decirlo.

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

Respuesta

12

La clave está en GROUP BY/HAVING usando un COUNT de nombres de teléfono DISTINCT. Cuando el recuento es 2, sabrá que el usuario tiene ambos teléfonos.

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

Muchas gracias Joe! – enchance

+2

@enchance: Nada dice "gracias" como una respuesta aceptada. :-) –

+0

Lo tienes, hombre. Además, en lugar de llamar a la tabla 'mark5', lo convertiste en m5, no sabía que puedes hacerlo simplemente escribiéndolo después del nombre de la tabla. ¿Es eso el equivalente de AS que es para los nombres de columna? – enchance

0

La respuesta creo que busca es:

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

Creo que va a responder a sus preguntas en el que está tirando de los distintos nombres de Mark5 y unen sus otras mesas en esos valores específicos donde el nombre del teléfono es HTC o Samsung

+3

Estoy bastante seguro de que no puedes usar && en lugar de AND, pero podría estar equivocado. De todos modos, eso nunca devolverá ninguna fila porque el nombre de un teléfono no puede ser HTC y Samsung al mismo tiempo. –

+0

No devuelve nada. La respuesta de Joe es mucho mejor. – enchance