2012-12-23 11 views
6

Pozwala tylko powiedzieć, że mam 2 zestawy wynik następującoMySQL: Łącząc wyniki 2 kolumny w jednej instrukcji

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

muszę połączyć te wynikają w jednym zestawie, Więc musiałbym coś podobnego to:

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

Obecnie robię to z aa UNII tak:

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 

Zasadniczo kończę wykonywanie tej samej operacji dwa razy na stole, Po prostu pobierając różne wiersze za każdym razem. Czy istnieje skuteczniejszy sposób, w jaki mógłbym to zrobić? Potrzebuję wynik w jednej kolumnie, ponieważ jest to ograniczenie IN. W dłuższej perspektywie, co muszę zrobić to

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) 

Czy istnieje lepszy sposób, aby przejść o znalezienie tego wszystkiego? Każda pomoc jest mile widziana.

+0

SQL deklaruje wynik Wanted, a nie metodę obliczeniową. Do tego użyj polecenia 'EXPLAIN' –

+0

Nie możesz użyć' SELECT c_1 jako r1, c_2 jako r2 ... '? Czy używasz zmiennej 'result'? – bozdoz

+0

Osobiście unikam używania IN, kiedy tylko to możliwe, chyba że wiem, że zawsze będzie to mały zestaw w małym stoliku. Odpowiedź Michaela Berkowskiego jest moim preferowanym sposobem używania 'wewnętrznego połączenia'. Upewnij się tylko, czy masz indeksy na wszystko, co zamierzasz używać jako klucze, lub skonfiguruj odpowiednie klucze obce pod względem wydajności. – Levi

Odpowiedz

6

Zamiast IN() podzapytaniu można wykonać INNER JOIN na alboc_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

Dobre rzeczy! Działa jak marzenie. –

+1

@GreyOne Great - chętnie pomożemy i zapraszamy do Stack Overflow. –

Powiązane problemy