2017-06-06 1 views
0

Mein Problem ist das Folgende, ich möchte eine Liste von ID in einer Variablen festlegen, dann verwenden Sie diese Variable in einer Unterabfrage. Das Problem ist, dass WorkBench (meine GUI) den folgenden Fehler zurückgibt: "Unterabfrage, die mehrere Zeilen zurückgibt". Das scheint mir das zu sein, was ich will.
Bitte erklären Sie mir, wo ich falsch liege.Legen Sie eine Liste in einer Variablen in Unterabfrage - MYSQL

Dies ist meine Frage:

set @listID := (select ID_VOIE as ID from voies 
    where ORIGINE = 'XXX' 
    group by CODE_INSEE, CODE_VOIE 
    having count(*) > 1); 

select substring(v.CODE_INSEE,1,2), count(*) from voies v 
    where v.ID_VOIE in (@listID) 
    group by substring(vs.CODE_INSEE,1,2); 

Die Sache ist ich mit der „Gruppe von“ gesperrt bin, möchte ich nach einer ersten Gruppe eine groupd tun durch, deshalb kann ich nicht (oder Zumindest habe ich keinen Weg gefunden) schreibe die Anfrage mit einer einzigen WHERE-Klausel.

Die Sache ist, ich weiß, dass ich die ganze Anfrage direkt in meiner Unterabfrage setzen kann stattdessen Variable verwenden, aber:

  • Es kann ich diesen Trick in einem anderen Anfragen verwenden lassen, die dieses Verhalten erforderlich (DRY ! Konzept)
  • ich bin nicht sicher, aber die Unterabfrage wird in jeder Runde meiner Schleife ausgeführt werden, und das wird sehr ineffizient

So suche ich zwei Möglichkeiten: eine Art und Weise, die ich benutzen ließ eine Liste in einer Var In einer Unterabfrage oder in einer Art, in der ich zweimal in einer einzigen Abfrage "gruppieren" verwenden kann.

Vielen Dank im Voraus für Ihre Antworten (oh und Entschuldigung für mein Englisch, das ist nicht meine Muttersprache).

+0

Diese Art von Problem ist symptomatisch für schlechtes Design. – Strawberry

+0

Es wäre schön, wenn Sie ein wenig expliziter über "schlechtes Design" sein könnten. –

+0

Siehe Normalisierung. – Strawberry

Antwort

1

Wenn Sie diese Variable für etwas anderes benötigen, sollten Sie in der Lage sein, es ganz zu überspringen, wie folgt:

SELECT 
    SUBSTRING(v.CODE_INSEE,1,2), 
    COUNT(*) 
FROM 
    voies v 
WHERE 
    v.ID_VOIE in 
    (SELECT 
     ID_VOIE as ID 
    FROM 
     voies 
    WHERE 
     ORIGINE = 'XXX' 
    GROUP BY 
     CODE_INSEE, 
     CODE_VOIE 
    HAVING COUNT(*) > 1) 
GROUP BY 
    SUBSTRING(vs.CODE_INSEE,1,2); 

Wie Sie sagen, wird die Unterabfrage für alle Zeilen ausgeführt werden. Um dies zu vermeiden, wäre eine Variable am besten, aber MySQL unterstützt keine Tabellenvariablen. Stattdessen können Sie eine temporäre Tabelle verwenden:

IF EXISTS DROP TABLE myTempTable; 
CREATE TEMPORARY TABLE myTempTable (ID_VOIE int); -- I don't know the datatype 
INSERT INTO myTempTable (ID_VOIE) 
SELECT DISTINCT -- using distinct so I can join instead of use IN. 
    ID_VOIE as ID from voies 
WHERE 
    ORIGINE = 'XXX' 
GROUP BY 
    CODE_INSEE, CODE_VOIE 
HAVING COUNT(*) > 1 

Und jetzt können Sie dies tun:

SELECT 
    SUBSTRING(v.CODE_INSEE,1,2), COUNT(*) 
FROM 
    voies v 
    JOIN myTempTable tt ON 
     v.ID_VOIE = tt.ID_VOIE 
GROUP BY SUBSTRING(vs.CODE_INSEE,1,2); 
+0

Das meinte ich mit "Das Ding ist, ich weiß, dass ich die ganze Anfrage direkt in meine Unterabfrage stellen kann, anstatt die Variable zu verwenden". Hier habe ich nicht mehr als nötig, aber ich brauche ein Vielfaches dieses Ergebnisses. Trotzdem Danke für Ihre Antwort. –

+0

Edit: Ihr Update wenn erstaunlich, ich bin Goign, es zu versuchen. –

+0

Final Edit: Es scheint, dass die Anfrage funktioniert und mir geben, was ich wollte. Danke für alles! Nur eine einzige Sache: Ich musste die 3IF "Anweisung löschen, weil WorkBench mir sagte" ungültige Eingabe an dieser Position ". –

Verwandte Themen