2012-12-23 6 views
6

Kombination Nehmen wir nur 2 Ergebnismengen Ich habe alsMySQL: die Ergebnisse von zwei Spalten in einer Anweisung

R1  R2 
| 1 |  | 5 | 
| 2 |  | 6 | 
| 3 |  | 7 | 
| 4 |  | 8 | 

folgt ich diese Folge in einen einzigen Satz kombinieren müssen, Also etwas, was ich möchte dies:

R3 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 

Derzeit ich tue dies mit aa UNION etwa so:

SELECT c_1 AS result FROM table WHERE c_1=3 OR c_2=3 
UNION 
SELECT c_2 AS result FROM table WHERE c_1=3 OR c_2=3 

Im Grunde habe ich am Ende die gleiche Operation zweimal auf der Tabelle, Nur verschiedene Zeilen jedes Mal abrufen. Gibt es einen effizienteren Weg, dies zu tun? Ich brauche das Ergebnis in einer einzigen Spalte, da dies eine Einschränkung von IN ist. Auf lange Sicht, was ich tun muss, ist dies

SELECT name FROM person WHERE person_id IN 
(SELECT c_1 AS result FROM table WHERE c_1=3 OR c_2=3 
UNION 
SELECT c_2 AS result FROM table WHERE c_1=3 OR c_2=3) 

Gibt es einen besseren Weg, um zu gehen, all das zu finden? Jede Hilfe ist willkommen.

+0

SQL ausführen erklärt das gewünschte Ergebnis, nicht die Berechnungsmethode. Benutzen Sie dazu den Befehl 'EXPLAIN' –

+0

Können Sie nicht' SELECT c_1 als r1, c_2 als r2 ... 'verwenden? Verwenden Sie auch die Variable 'result'? – bozdoz

+0

Persönlich vermeide ich die Verwendung von IN wann immer es möglich ist, es sei denn, ich weiß, dass es immer ein kleiner Satz in einer kleinen Tabelle sein wird. Michael Berkowskis Antwort ist mein bevorzugter Weg mit 'inner join'. Stellen Sie nur sicher, dass Sie Indizes für alles haben, was Sie als Schlüssel verwenden möchten, oder richten Sie geeignete Fremdschlüssel für die Leistung ein. – Levi

Antwort

6

Anstelle der IN() Unterabfrage können Sie ein INNER JOIN auf entwederc_1 OR c_2

SELECT 
    name 
FROM 
    person 
    /* Join against the other table on *either* column c_1 or c_2 */ 
    INNER JOIN `table` ON `table`.c_1 = person.person_id OR `table`.c_2 = person.person_id 
WHERE 
    /* And the WHERE condition only needs to be applied once */ 
    c_1 = 3 OR c_2 = 3 

http://sqlfiddle.com/#!2/4d159/1

+2

Gute Sachen! Klappt wunderbar. –

+1

@GreyOne Großartig - glücklich zu helfen, und willkommen zu Stack Overflow. –

Verwandte Themen