2012-09-08 12 views
11

Tengo una tabla con 2 columnas (ver a continuación). Un miembro puede tener múltiples respuestas a una pregunta:¿Cómo consultar una tabla de unión para que se cumplan varios criterios?

RESPONSES 
--------- 
member_id INT 
response_id INT 
SAMPLE DATA 
member_id -- response_id 
    1  --  3 
    1  --  5 
    2  --  1 
    2  --  5 
    2  --  9 
    3  --  1 
    3  --  5 
    3  --  6 

Lo que necesito hacer es consultar la tabla para los miembros que cumplen con todos los criterios de respuesta. Por ejemplo, necesito seleccionar todos los miembros que tienen un RESPONSE_ID de 1 y 5. Estoy utilizando la siguiente consulta:

SELECT DISTINCT member_id 
FROM responses 
WHERE response_id = 1 AND response_id = 5 

que se puede esperar para volver 2 y 3. Sin embargo, yo estoy haciendo nada de member_id devueltos. Usé EXPLAIN y muestra que hay un error en mi consulta. ¿Qué estoy haciendo mal?

Además, ¿existe una función similar a IN en la que se deben cumplir todos los criterios para que sea verdadera?

+0

mi punto de vista, es necesario 'o' en lugar de 'y' allí. – hjpotter92

+1

Su condición WHERE se aplica a cada fila individualmente. Como resultado, nunca puede ser cierto, porque una columna no puede ser igual a 1 y a 5 al mismo tiempo. –

Respuesta

10

Esto debería funcionar:

SELECT member_ID 
FROM responses 
WHERE response_ID IN (1,5) 
GROUP BY member_ID 
HAVING COUNT(DISTINCT response_id) = 2 

Es necesario contar el número de registros devueltos que es igual al número de valores proporcionados en la cláusula IN.

SQLFiddle Demo

+2

'TENER COUNT (DISTINCT response_id) = 2' capta el caso en el que el miembro ha respondido el mismo valor dos veces. – podiluska

+0

@podiluska, sí, pasé por alto esta frase: "el miembro puede tener múltiples respuestas a una pregunta". gracias a ti. –

+1

Sin embargo, esto no significa que un miembro pueda tener múltiples respuestas * idénticas *. Aún así, el OP no aclara si las respuestas idénticas son posibles o no, por lo que es mejor estar en el lado seguro y usar 'COUNT (DISTINCT) '. Pero aclararía en mi respuesta que si se garantizaba que múltiples respuestas idénticas serían imposibles, sería preferible 'COUNT (*)', ya que 'DISTINCT' agrega algo de sobrecarga. –

Cuestiones relacionadas