2013-07-18 20 views
1

這與我以前發表的一篇文章非常相似:但它有點不同。所以,如果它看起來很熟悉:請原諒我的學習曲線試圖瞭解:「那麼這個案例和那個案例呢......」排除記錄非唯一字段數據

我有一個很好的小查詢工作。它查詢單 「的客戶」 表

下面是表:SQLFiddle是在這裏:http://sqlfiddle.com/#!2/1fcea

CREATE TABLE `clients` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `name` VARCHAR(45) NULL , 
    `address` VARCHAR(45) NULL , 
    `state` VARCHAR(45) NULL , 
    `foo` VARCHAR(45) NULL , 
    `phone` VARCHAR(45) NULL , 
    PRIMARY KEY (`id`)); 

INSERT INTO`clients` 
    (`name`, `address`, `state`, `foo`, `phone`) 
VALUES 
    ('Jim', '123 Main', 'MO', '876', '2038221661'); 
INSERT INTO`clients` 
    (`name`, `address`, `state`, `foo`, `phone`) 
VALUES 
    ('Tom ', '234 Elm', 'MO', '433', '2038221661'); 
INSERT INTO`clients` 
    (`name`, `address`, `state`, `foo`, `phone`) 
VALUES 
    ('Steve', '653 Pine', 'CT', '863', '5125901977'); 
INSERT INTO`clients` 
    (`name`, `address`, `state`, `foo`, `phone`) 
VALUES 
    ('Dave', '654 Oak', 'NV', '872', '8769085435'); 
INSERT INTO`clients` 
    (`name`, `address`, `state`, `foo`, `phone`) 
VALUES 
    ('Oscar', '622 FIrst ', 'LA', '625', '5125551212'); 

下面是該查詢

SELECT id, 
     name, 
     address, 
     phone 
FROM clients 
WHERE state IN ('MO', 'LA', 'CT') 
     AND foo > 40 
ORDER BY foo 

返回:

2 Tom  234 Elm  2038221661 
5 Oscar 622 First 5125551212 
3 Steve 653 Pine 5125901977 
1 Jim  123 Main 2038221661 

我想完全禁止任何沒有完全唯一電話號碼的記錄。

我需要它抑制(1)吉姆和(2)湯姆和返回

5 Oscar 622 First 5125551212 
3 Steve 653 Pine 5125901977 

回答

3
SELECT id, 
     name, 
     address, 
     phone 
FROM clients 
WHERE state IN ('MO', 'LA', 'CT') 
     AND foo > 40 
     AND phone not in 
     (
      select phone 
      from clients 
      group by phone 
      having count(*) > 1 
     ) 
ORDER BY foo 
+0

我們同時發佈:) – dougEfresh

+1

是的 - 正確;) –

+0

嗯謝謝你們。我確實工作。現在我需要學會優化。在200,000條記錄上,查詢需要39秒! – JVMX

1

這應該排除重複號碼:

SELECT id, 
    name, 
    address, 
    phone 
FROM clients 
WHERE state IN ('MO', 'LA', 'CT') 
    AND foo > 40 
    AND phone not in (select phone from clients 
        group by phone having count(*) > 1) 
ORDER BY foo 
2

實際上,你可以做到這一點了group by

SELECT id, name, address, phone 
FROM clients 
WHERE state IN ('MO', 'LA', 'CT') AND foo > 40 
group by phone 
having count(*) = 1 
ORDER BY foo; 

這個電話號碼分組。 id,nameaddress來自任意記錄。但是,因爲只有一個(由於having條款),這些將是來自該一條記錄的字段。