2012-09-21 38 views
6

Esto sería mejor para mostrar en mi ejemplo:SELECCIONAR varias filas DONDE coinciden dos condiciones

Tengo una tabla, donde los usuarios almacenados responden de una gran forma. Cada formulario tiene 139 preguntas. Estas preguntas se almacenan en una tabla diferente, se unen cuando es necesario con questionID. Para cada usuario, hay una ID. Ahora necesito hacer filtros, para mostrar solo los usuarios que coincidan con una o más respuestas a preguntas específicas.

Por ejemplo, quiero usuarios, donde la pregunta 14 tiene respuesta "sí", la pregunta 54 no está vacío y la pregunta 100 es mayor que 10. Así es como se ve la tabla:

**userID** | **questionID** | **answer** 

1   14    "yes" 
1   54    "something" 
1   100    "9" 
2   14    "no" 
2   54    "north 
2   100    "50" 
3   14    "yes" 
3   54    "test" 
3   100    "12" 

como resultado i solo quiere que se devuelva userID 3, ya que cumple con todas las condiciones.

Esto sería fácil de alcanzar con ColdFusion, ya que permite consultas en resultados consultados, pero en PHP no he encontrado ninguna manera. Es importante tener la oportunidad de agregar un número aleatorio de preguntas, no solo tres como en este ejemplo.

+0

¿Cuál es su esquema de la tabla? (el resultado de 'SHOW CREATE TABLE your_table') – Jocelyn

+0

CREATE TABLE 'leal_dotaznik' ( ' ID' int (11) NOT NULL auto_increment, 'UID' int (11) NOT NULL, ' questionID' int (11) NOT NULL, 'answer' text NOT NULL, PRIMARY KEY (' ID') ) ENGINE = MyISAM AUTO_INCREMENT = 3059 DEFAULT CHARSET = utf8 –

Respuesta

7

intento,

SELECT userID 
FROM tableName 
WHERE (questionID = 14 AND 
     answer = 'yes') OR 
     (questionID = 54 AND 
     answer <> 'empty') OR 
     (questionid = 100 AND 
     answer > 10) 
GROUP BY userID 
HAVING COUNT(*) = 3 

SQLFiddle Demo

+0

¿Cómo adivinó la estructura de la tabla del OP? – Jocelyn

+0

@Jocelyn vea la pregunta anterior, hay una tabla :) –

+0

Veo un texto que dice "Estas preguntas están almacenadas en ** tabla diferente **, unidas cuando es necesario con questionID". – Jocelyn

1

que puede probar:

SELECT questionID, answer 
FROM table 
WHERE (questionID = 14 AND answer = 'yes') 
OR (questionID = 54 AND answer != '') 
OR (questionID = 100 AND answer > 10); 
+0

has codificado el usuario del resultado por userID = 3. Por cierto, fue un ejemplo –

+0

Gracias, pero de todos modos creo que @Matei Mihai tiene la respuesta correcta. Él quiere todas las condiciones a la vez, no una de ellas al menos. –

+0

Esto no cumplirá * todas * las condiciones, solo una de ellas. – davek

4
SELECT q.userID 
    FROM questions q 
    JOIN questions qq ON qq.userID=q.userID 
     AND qq.questionID='54' AND qq.answer IS NOT NULL 
    JOIN questions qqq ON qqq.userID=q.userID 
     AND qqq.questionID='100' AND qqq.answer > 10 
WHERE q.questionID=14 
    AND q.answer = 'yes' 
Cuestiones relacionadas