以下查询正在提取重复的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
答案 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
列,则应在其余列上使用聚合函数(例如MIN
或MAX
) - 否则,如果有多个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.id
和site.id
分别是deal_woot
和site
表的主键。