2011-02-12 59 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表。