MySQL如何返回唯一/不同的结果?
Posted
技术标签:
【中文标题】MySQL如何返回唯一/不同的结果?【英文标题】:MySQL How to Return Unique/Distinct Results? 【发布时间】:2011-06-07 11:37:11 【问题描述】:我正在运行以下 mysql 查询来查找没有手册(并且有黑色车轮等)的汽车
SELECT `cars`.* FROM `cars`
INNER JOIN wheels ON cars.id = wheels.car_id
LEFT OUTER JOIN manuals ON cars.id = manuals.car_id
WHERE (cars.created_at > '2010-09-09'
AND wheels.color = 'Black'
AND wheels.created_at < '2011-01-05'
AND manuals.car_id IS NULL)
查询的结果看起来是正确的,但它两次返回了 id 为 27 的汽车。如何更改查询以使所有结果都是唯一的(不重复)?
【问题讨论】:
是的,我认为你是对的,但我也想加入***。我更新了问题以明确这一点。 您应该将答案标记为正确 【参考方案1】:在查询末尾添加group by cars.id
例如:
SELECT `cars`.* FROM `cars`
INNER JOIN wheels ON cars.id = wheels.car_id
LEFT OUTER JOIN manuals ON cars.id = manuals.car_id
WHERE (cars.created_at > '2010-09-09'
AND wheels.color = 'Black'
AND wheels.created_at < '2011-01-05'
AND manuals.car_id IS NULL)
GROUP BY cars.id
【讨论】:
成功了!现在,SELECT DISTINCT
或 GROUP BY
哪个更好?他们似乎都花费了大约相同的时间。
在大多数情况下,可以将 DISTINCT 子句视为 GROUP BY 的特例 - 这是从这里dev.mysql.com/doc/refman/4.1/en/distinct-optimization.html
不错。谢谢你。 :-)【参考方案2】:
您可以尝试 SELECT DISTINCT
而不是 SELECT
【讨论】:
成功了!现在,SELECT DISTINCT
或 GROUP BY
哪个更好?他们似乎都花费了大约相同的时间。
@ma11hew28 select distinct 和 group by 参考sql中完全不同的概念【参考方案3】:
假设cars.id
是唯一的主键,其中一个连接会导致笛卡尔积。也就是说:wheels
或 manuals
包含多个匹配 cars.id = 27
。
子查询通常是消除笛卡尔积的好工具。下面的示例查询显示了使用子查询的两种方法。
第一个子查询确保我们只查看在 2011 年 1 月 5 日之前创建该记录的带有黑色车轮的汽车。 GROUP BY
子句确保每个w.car_id
只返回一条记录。
第二个子查询(有时称为相关子查询)确保在主查询中没有为每辆汽车找到手册。
未经测试,但传达了这个想法:
SELECT `cars`.*
FROM `cars`
JOIN (
SELECT w.car_id
FROM wheels w
WHERE w.color = 'Black'
AND w.created_at < '2011-01-05'
GROUP BY w.car_id
) wheels
ON cars.id = wheels.car_id
WHERE
cars.created_at > '2010-09-09'
AND
NOT EXISTS (SELECT m.car_id FROM manuals m WHERE m.car_id = cars.id)
【讨论】:
以上是关于MySQL如何返回唯一/不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章
如何告诉 JPA CriteriaBuilder 按返回的唯一数据列排序?
如何在 MySQL 5.7 中的 JSON 数组中获取唯一/不同的元素