2010-02-13 9 views
5

Das ist vielleicht nicht sehr sinnvoll, aber ich möchte, dass MySQL mir die genauen doppelten Zeilen zurückgibt, wenn es doppelte Kriterien in der WHERE IN Klausel gibt. Ist das möglich?Erzwinge MySQL, dass Duplikate aus der WHERE IN-Klausel zurückgegeben werden, ohne JOIN/UNION zu verwenden?

dieses Beispiel nehmen:

SELECT 
    columns 
FROM 
    table 
WHERE 
    id IN(1, 2, 3, 4, 5, 1, 2, 5, 5) 

I'ld wie MySQL mich zurück Zeilen mit id 5 dreimal, die ID 1 und 2 zweimal, und 3 und 4 einmal.

Als Länge der IN Argumente sowie die doppelte Zählung (einmal, zweimal, dreimal, etc.), wird willkürlich sein, die ich auf UNION oder JOIN verlassen wollen nicht. Ist so etwas sonst möglich?

Antwort

2

Ich bin mir nicht sicher, warum Sie JOIN als essentiell für SQL verbieten wollen. Es ist wie das Verbot von Funktionsaufrufen in einer funktionalen Sprache.

Ein guter Weg, um dies zu lösen, ist eine Ergebnismenge zu erstellen, die die IDs enthält, die Sie zurückgeben und damit verbinden möchten. Hier ist eine Möglichkeit, es zu tun:

SELECT Table1.* 
FROM Table1 
JOIN (SELECT 1 AS id 
     UNION ALL SELECT 2 
     UNION ALL SELECT 3 
     UNION ALL SELECT 4 
     UNION ALL SELECT 5 
     UNION ALL SELECT 1 
     UNION ALL SELECT 2 
     UNION ALL SELECT 5 
     UNION ALL SELECT 5) AS T1 
ON Table1.id = T1.id 

Ich bin nicht sicher, wenn Sie diese Methode in Betracht gezogen haben? Es hat keines der Probleme, vor denen Sie Angst zu haben scheinen.

Wenn Sie Joins verbieten, können Sie dies nicht tun, es sei denn, Sie verwenden eine gespeicherte Prozedur, was ich sagen würde ist schlimmer als Beitritt.

+0

Hallo Markus, danke für deine Antwort. Nach dem Aussehen der Dinge, denke ich, werde ich dann einfach mit JOIN und UNION gehen müssen. Ich war mir der Verwendung von UNION nicht bewusst, so wie Sie es hier benutzen. Ich bin mir nicht einmal sicher, ob ich es vollständig verstehe. :) Aber es sieht sehr schick aus! Der Grund, warum ich UNION zunächst nicht verwenden wollte, ist, weil ich dachte, ich müsste die SELECT-Anweisungen immer wieder wiederholen. Dies sieht jedoch viel sauberer aus. –

+0

Werden diese UNIONs übrigens die genaue Reihenfolge des Ergebnisses garantieren, oder muss ich immer noch eine ORDER-Klausel verwenden, um sie genau so zu bestellen, wie sie in der Erklärung standen? –

+0

Sie benötigen * eine Bestellung, wenn Sie die Bestellung garantieren möchten. Das ist immer wahr. Glücklicherweise ist es einfach, die obige Abfrage zu ändern: 'SELECT 1 als ID, 1 als SortOrder UNION ALL SELECT 2, 2 UNION ALLE SELECT 3, 3' etc ... dann' ORDER BY SortOrder' am Ende nach dem 'JOIN .. . ON ... '. –

Verwandte Themen