2012-12-23 21 views
6

sadece Lets ben, Yani böyle bir şey olurdu tek SET içine bu sonuca birleştirmek gerekirMySQL: Bir açıklamada 2 sütun sonuçlarını birleştiren

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

şöyle ben 2 sonuç kümelerini olduğunu varsayalım Bu: Şu

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

, ben şöyle aa BİRLİĞİ ile yapıyorum:

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 

Temel olarak, aynı işlemi tablo üzerinde iki kez gerçekleştirmeyi bitiriyorum, Her seferinde farklı satırlar alınıyor. Bunu yapmanın daha verimli bir yolu var mı? Tek bir sütunda sonuca ihtiyacım var, çünkü bu bir IN sınırlamasıdır. Uzun vadede , ne yapmam gerekiyor bu

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) 

tüm bu bulma konusunda gitmek için daha iyi bir yolu var mı? Her türlü yardım kabul edilir. Yerine IN() alt sorgunun

+0

SQL üzerinde INNER JOIN gerçekleştirebilir istenilen sonucu yerine hesaplama yöntemi bildirir. Bunun için 'EXPLAIN' –

+0

komutunu kullanın. C_1 seçimlerini r1, c_2 r2 ...' olarak kullanamaz mısınız? Ayrıca, 'result' değişkenini kullanıyor musunuz? – bozdoz

+0

Şahsen Mümkün olduğu sürece IN kullanmamaya özen gösterdim, bence küçük bir masada her zaman küçük bir set olacak. Michael Berkowski'nin cevabı, “iç birleştirme” yi kullanarak tercih ettiğim yoldur. Anahtar olarak kullanmak istediğiniz her şeyde indekslerinizin olduğundan emin olun veya performans için uygun yabancı anahtarlar oluşturun. – Levi

cevap

6

, sen ya c_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

İyi şeyler! ÇALIŞIYOR bir cazibe gibi. –

+1

@GreyOne Büyük - Yardım etmek için mutluyum ve Stack Overflow'a hoş geldiniz. –