2016-04-11 15 views
2

Ich habe eine riesige schmerzhafte geerbte Tabelle von ein paar Millionen Datensätze Ich habe Probleme bei der Abfrage effizient. Die Tabelle sieht ein wenig wie folgt aus:SQL - Finden Sie alle "Relationship IDs", wo Schlüssel gleich Wert, dann wählen Sie alle Datensätze mit diesen "Relationship IDs"

id | submissionId | key  | value 
------------------------------------ 
1 | 1   | userID | 1 
2 | 1   | data | stuff 
3 | 2   | userID | 2 
4 | 2   | data | stuff2 
5 | 2   | data2 | stuff3 
6 | 3   | userID | 1 
7 | 3   | data | stuff2 
8 | 3   | data2 | stuff3 

Was ich Abfrage versuche ist alles auswählen „Unterwerfung Daten“ für einen bestimmten Benutzer. So das Ergebnis für userID === 1 würde nur wählen userID verwandt „Unterwerfung Daten“, das heißt:

1 | 1   | userID | 1 
2 | 1   | data | stuff 
6 | 3   | userID | 1 
7 | 3   | data | stuff2 
8 | 3   | data2 | stuff3 

Im Moment meine beste Lösung ist, alle Datensätze für eine bestimmte Benutzer-ID auswählen. Durchlaufen Sie dann die Ergebnisse und fügen Sie die injectionIDs in ein Array ein. Dann alle Datensätze auswählen, bei denen die EinreichungsID mit einer EinreichungsID in meinem Array übereinstimmt.

Dies wird sehr zeitaufwendig, da es rund 15.000 Benutzer gibt, die ebenfalls durchgeschleift werden müssen. Irgendwelche Ideen, um dies effizienter zu machen oder in einer einzigen Abfrage würden sehr geschätzt werden!

+0

markieren Sie keine Produkte, die nicht direkt beteiligt .. . – jarlh

Antwort

0

Sie können einfach für jeden Datensatz abfragen, die eine submissionId zu einem bestimmten value bezogen hat:

SELECT * 
FROM submissions 
WHERE submissionId IN (SELECT submissionId 
         FROM submissions 
         WHERE value = 1 AND key = 'userID') 
0

mit EXISTS Sie können versuchen:

SELECT * 
FROM mytable AS t1 
WHERE EXISTS (SELECT * 
       FROM mytable AS t2 
       WHERE t2.submissionId = t1.submissionId AND 
        t2.key = 'userID' AND t2.value = 1) 
Verwandte Themen