2016-06-25 17 views
0

ich den besten Weg zu finden, ich versuche, eine bedingte Abfrage auf einer Tabelle auszuführen, die wie folgt aussehen wird:Conditional select mit MYSQL, Performance-Problem

 
primaryKey question  answer clientId 
    1  are you fine?  yes  Bob 
    2  are you fine?  no   Tom 
    3  what is your name Bob  Bob 
    4  What is your name Tom  Tom 

ich in dieser Tabelle den Primärschlüssel wählen haben, alle Antworten auf die Frage "Wie heißt du?", aber nur für diejenigen, die mit "Ja" zu "geht es dir gut" beantwortet (dh ich möchte 3)

Ich habe versucht, eine Unterabfrage in einer where in-Klausel so :

 
SELECT primaryKey 
FROM (`questionTable`) 
WHERE clientId IN(
SELECT clientId FROM `questionTable` 
WHERE (question = "are you fine" AND answer = "yes") 
) 
AND question = "What is your name" 

Diese Abfrage endet eigentlich nie, sie wirft keinen Fehler, sie läuft einfach für immer.

Die einzige Lösung, die ich gefunden habe, involvieren die Auswahl der clientId anstelle des Primärschlüssels, aber das ist zu langsam und ich möchte einen Weg finden, um den Primärschlüssel in einer Abfrage abzurufen.

+0

Sie müssen die Indizes der Tabellen zeigen (ich denke, Sie haben keine Ausnahme Primärschlüssel). Und Sie sollten eine Frage-Tabelle haben, wo Sie die Spalten Frage, Frage, zB 1, "geht es Ihnen gut" und 2, "wie heißt du" und dann haben Sie diese Frage in Ihrer Tabelle und fügen Sie einen Index dafür . Gleiches für clientId. – Solarflare

Antwort

1

Verwenden Sie einen Self-Join die Tabelle:

SELECT t1.primaryKey 
FROM `questionTable` t1 
INNER JOIN `questionTable` t2 
    ON t1.clientId = t2.clientId 
WHERE t2.question = "are you fine?" AND 
     t2.answer = "yes" AND 
     t1.question = "What is your name" 

SQLFiddle

+0

@TimBiegeleisen Ok, über Join ist es richtiger. Aber warum nicht "benutzen"? – splash58

+0

Ob Sie es glauben oder nicht, ich habe nicht wirklich gesehen, dass 'USING' zu oft benutzt wird. Ich denke nur, dass es schöner ist, explizit über die Art des Joins zu sprechen. –

+0

Diese Abfrage gibt keine korrekten Daten zurück. – Manish