2010-02-19 16 views
27

yılında KESIŞEN. kayıtların birden fazla alanı vardır (ad, soyadı, vb.). Bu alanların her biri, gerçek değerin saklandığı veri tablosu için bir yabancı anahtardır. Birden fazla kayıt alanında arama yapmam gerekiyor.Ben iki tablo, kayıt ve veri var MySQL

Aşağıda INTERSECT kullanarak bir örnek sorgu, ama MySQL çalışan bir tanesini gerekir.

SELECT records.id FROM records, data WHERE data.id = records.firstname AND data.value = "john" 
INTERSECT 
SELECT records.id FROM records, data WHERE data.id = records.lastname AND data.value = "smith" 

Yardımlarınız için teşekkür ederiz.

+1

bu göz at: http://www.codinghorror.com/ Blog/2007/10/a-işitsel-açıklama-of-sql-joins.html –

+0

@ Mike Atlas: Bu katılır ile ilgisi yoktur. Bu şekilde çözülebilir, ama Jeff'in blog yazısı uygun değil. – Aaronaught

+1

Evet, bu birleşme ile ilgili ve ilgili. Hangi SQL birleştirmesinin, iki verinin (iç birleştirme) kesişimine eşdeğer olduğunu açıklar. Bundan, Jeremy "kesişim" için standart SQL sözdizimini çözebilmelidir. Diğerleri tam olarak aşağıdaki cevabı verdiğinden bunu sadece bir yorum olarak yayınladım. –

cevap

23

başka tablodaki eşleşen bir satır varsa satırlar için filtrelemek için bir iç katılmak kullanabilirsiniz:

SELECT DISTINCT records.id 
FROM records 
WHERE records.firstname IN (
    select id from data where value = 'john' 
) AND records.lastname IN (
    select id from data where value = 'smith' 
) 
+1

"WHERE" yan tümcesi fikrini seviyorum – scottyseus

5

Kullanım yerine katılır:

diğer birçok alternatifleri
SELECT DISTINCT records.id 
FROM records 
INNER JOIN data d1 on d1.id = records.firstname AND data.value = "john" 
INNER JOIN data d2 on d2.id = records.lastname AND data.value = "smith" 

biri, bir in deyimdir : Burada

SELECT records.id 
FROM records 
JOIN data AS D1 ON records.firstname = D1.id 
JOIN data AS D2 ON records.lastname = D2.id 
WHERE D1.value = 'john' and D2.value = 'smith' 

bazı test verileri var:

CREATE TABLE records (id INT NOT NULL, firstname INT NOT NULL, lastname INT NOT NULL); 
INSERT INTO records (id, firstname, lastname) VALUES 
(1, 1, 1), 
(2, 1, 2), 
(3, 2, 1), 
(4, 2, 2); 

CREATE TABLE data (id INT NOT NULL, value NVARCHAR(100) NOT NULL); 
INSERT INTO data (id, value) VALUES 
(1, 'john'), 
(2, 'smith'); 

Beklenen sonuç:

2 

test verisi muhtemelen poster için kullanışlı değildir, ama istedikleri insanları için düzgün çalışması veya görmek için çözümler kontrol etmek istiyorum seçmenler için yararlı olabilir cevaplarını kendi cevaplarını test edebilecekleri şekilde gönderin.

8

Bu yöntem takip etmek çok daha kolay olduğunu düşünüyorum, ama başlangıçta yinelenen kayıtların bir sürü kadar yükleme çünkü bununla ilişkili bir yükü biraz var. Yaklaşık 10000-50000 kayıt içeren bir veritabanında kullanırım ve genellikle yaklaşık 5 sorgu ile kesişir ve performans kabul edilebilir.

Tek yapmanız "UNION ALL" Sen kesişir ve her zaman var hangilerinin görmek istiyorum sorguların her olduğunu. ikimiz de sorgularda aynı kaydı alırsanız

SELECT * From (

    (Select data1.* From data1 Inner Join data2 on data1.id=data2.id where data2.something=true) 
    Union All 
    (Select data1.* From data1 Inner Join data3 on data1.id=data3.id where data3.something=false) 

) As tbl GROUP BY tbl.ID HAVING COUNT(*)=2 

Yani, sayısı 2 olacak var ve son çepeçevre sorgu bunu içerecektir.

MYSQL INTERSECT için genel bir yedek iç olduğunu
0

katılmak:

SELECT DISTINCT * FROM 
(SELECT f1, f2, f3... FROM table1 WHERE f1>0) 
INNER JOIN 
(SELECT f1, f2, f3... FROM table2 WHERE f1>0) 
USING(primary_key) 

Veya özellikle dava için

:

SELECT DISTINCT * FROM 
(SELECT records.id FROM records, data WHERE data.id = records.firstname AND data.value = "john") query1 
INNER JOIN 
(SELECT records.id FROM records, data WHERE data.id = records.lastname AND data.value = "smith") query2 
USING (id) 
İlgili konular