2011-02-12 54 views
1

下面的查詢使用DISTINCT拉複製site_id年代,隨着我,我想不通爲什麼...DISTINCT拉重複的列值

SELECT 
    DISTINCT site_id, 
    deal_woot.*, 
    site.woot_off, 
    site.name AS site_name 
FROM deal_woot 
INNER JOIN site ON site.id = site_id 
WHERE site_id IN (2, 3, 4, 5, 6) 
ORDER BY deal_woot.id DESC LIMIT 5 

回答

2

DISTINCT着眼於整個記錄,不只列。爲了完成你想要什麼,你需要使用GROUP BY

非工作代碼:

SELECT 
    site_id, 
    deal_woot.*, 
    site.woot_off, 
    site.name AS site_name 
FROM deal_woot 
INNER JOIN site ON site.id = site_id 
WHERE site_id IN (2, 3, 4, 5, 6) 
GROUP BY site_id 

爲什麼它不工作?如果您的列爲GROUP BY,則應在其餘列上使用聚合函數(例如MINMAX),否則,如果給定的site_id有多個site_woot_off,則不清楚SQL 這些值中的哪一個你想要SELECT

你可能會擴大到deal_woot.*列出每個其字段。

側面說明:如果你使用MySQL,我相信這不是技術上的必要指定一個聚合函數用於剩餘的列。如果不爲列指定聚合函數,它會爲您選擇一個列值(通常是結果集中的第一個值)。

2

您的查詢返回DISTINCT行,它不只是尋找在site_id。換句話說,如果任何列不同,則從該查詢返回新行。

這是有道理的,因爲如果你實際上有差異,又該爲deal_woot.*服務器回報值?如果要做到這一點,你需要指定這一點 - 也許通過獲取不同site_id的,然後讓其他值LIMIT 1在子查詢與適當的ORDER BY條款完成。

+0

他似乎使用Mysql,所以它應該是'LIMIT 1`,而不是'TOP 1'。 – a1ex07 2011-02-12 17:16:24

+0

如果它確實是MySql,則爲真,但據我所知,代碼示例在MSSQL中也是有效的。 – driis 2011-02-12 17:19:07

0

您只從一張表中選擇不同的值。當你與其他表連接它會拉符合每個不同的值從另一個表中的所有行,之後它直接導致重複ID的

0

如果你想選擇的網站信息,並從deal_woot表中的一行與同一SITE_ID,你需要使用不同的查詢。例如,

SELECT site.id, deal_woot.*, site.woot_off, site.name 
FROM site 
INNER JOIN 
    (SELECT site_id, MAX(id) as id FROM deal_woot 
    WHERE site_id IN (2,3,4,5,6) GROUP BY site_id) X 
ON (X.site_id = site.id) 
INNER JOIN deal_woot ON (deal_woot.id = X.id) 
WHERE site.id IN (2,3,4,5,6); 

無論sql語言/數據庫供應商如何,此查詢都應該可以工作。對於mysql,只需將group by site_id添加到原始查詢中,因爲它允許您使用GROUP BY而不使用聚合函數。
**我假定deal_woot.idsite.id分別是主鍵爲deal_wootsite表。