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 DISTINCTGROUP BY 哪个更好?他们似乎都花费了大约相同的时间。 在大多数情况下,可以将 DISTINCT 子句视为 GROUP BY 的特例 - 这是从这里dev.mysql.com/doc/refman/4.1/en/distinct-optimization.html 不错。谢谢你。 :-)【参考方案2】:

您可以尝试 SELECT DISTINCT 而不是 SELECT

【讨论】:

成功了!现在,SELECT DISTINCTGROUP BY 哪个更好?他们似乎都花费了大约相同的时间。 @ma11hew28 select distinct 和 group by 参考sql中完全不同的概念【参考方案3】:

假设cars.id 是唯一的主键,其中一个连接会导致笛卡尔积。也就是说:wheelsmanuals 包含多个匹配 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如何返回唯一/不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

Mysql - 仅返回具有相同唯一 ID 的第一行

如何告诉 JPA CriteriaBuilder 按返回的唯一数据列排序?

如何获取mysql数据库中某个表的主键或唯一字段

如何在 MySQL 5.7 中的 JSON 数组中获取唯一/不同的元素

如何解决此问题 org.hibernate.NonUniqueResultException:查询未返回唯一结果:4

如何在唯一的映射或非对象 JPA 中返回多个结果