2013-04-12 68 views
0

我有一個表有許多一對多的關係,其他兩個表時,列不和不等於值:匹配跨多行

CREATE TABLE assoc (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    ref1 INT NOT NULL, 
    ref2 INT NOT NULL, 
    INDEX composite_key (ref1, ref2) 
); 

我想,以確定是否有與REF1協會說匹配並且不匹配ref2的給定值。作爲一個例子,可以說我想匹配,如果爲REF1的關聯存在1000的價值和REF2任何其他值:

INSERT INTO assoc (ref1, ref2) VALUES 
    (100, 10), 
    (100, 1000); 

然而,沒有比賽應該如果只是數值1000被賦予與ref1相關聯,或者如果它是唯一的任何其他值:

INSERT INTO assoc (ref1,ref2) VALUES 
    (101, 10), 
    (102, 1000); 

我想出了兩個解決方案。 1)創建一個臨時表,其中包含與該值匹配的行的結果,然後從中選擇與該值不匹配的行,以及2)加入同一個表,並指定該表中不匹配的條件。

CREATE TEMPORARY TABLE set 
    SELECT ref1 FROM assoc 
    WHERE ref2 = 1000; 
SELECT assoc.ref1 FROM `set` 
    JOIN assoc ON `set`.ref1 = assoc.ref1 
    WHERE assoc.ref2 <> 1000; 

SELECT assoc.ref1 FROM assoc 
    JOIN assoc AS `set` ON assoc.ref1 = `set`.ref1 
    WHERE assoc.ref2 = 1000 AND `set`.ref2 <> 1000; 

但是,我想知道是否有其他方法可以完成此匹配?

回答

1

我認爲你的第二個解決方案是做你想做的事的標準方法;我會以同樣的方式去做。您還正確添加了INDEX composite_key。但是,您可以添加額外的GROUP BY以避免相同的assoc.ref1出現的次數與連接查找關聯行的次數相同:ref2 <> 1000:

SELECT assoc.ref1 FROM assoc 
    JOIN assoc AS `set` ON assoc.ref1 = `set`.ref1 
    WHERE assoc.ref2 = 1000 AND `set`.ref2 <> 1000 
    GROUP BY assoc.ref1;