DISTINCT提取重复的列值

时间:2011-02-12 16:59:35

标签: sql join distinct inner-join

以下查询正在提取重复的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

4 个答案:

答案 0 :(得分:2)

您的查询返回DISTINCT行,而不只是查看site_id。换句话说,如果任何列不同,则从该查询返回一个新行。

这是有道理的,因为如果你确实有差异,那么服务器应该作为deal_woot.*的值返回什么?如果要执行此操作,则需要指定此项 - 可能通过获取不同的site_id来完成,然后使用适当的LIMIT 1子句获取子查询中其他值的ORDER BY

答案 1 :(得分: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_woot_off对于给定的site_id,对于SQL ,您想要SELECT中的哪些值并不清楚。

您可能需要展开{​​{1}}以列出其每个字段。

旁注:如果您使用的是MySQL,我认为在技术上不需要为其余列指定聚合函数。如果没有为列指定聚合函数,它会为您选择单个列值(通常是结果集中的第一个值)。

答案 2 :(得分:0)

您只从一个表中选择不同的值。当您与另一个表连接时,它将从另一个表中提取与您的每个不同值匹配的所有行,从而导致重复的ID

答案 3 :(得分:0)

如果要从具有相同site_id的deal_woot表中选择站点信息和单行,则需要使用其他查询。例如,

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 dialect / db vendor如何,此查询都应该有效。对于mysql,您只需将group by site_id添加到原始查询中,因为它允许您使用GROUP BY而不使用聚合函数。
**我假设deal_woot.idsite.id分别是deal_wootsite表的主键。