9

当我查询

select distinct Name from Emp;

空表

身份证名称
1 山姆
2汤姆
3山姆

此查询是否从重复的名称或最后一个不同的名称(ID = 3)返回第一个不同的名称(ID = 1)

在这种情况下,distinct 关键字实际上是如何工作的?

4

2 回答 2

8

我认为这里有一个误解:您的查询不返回记录,只返回不同的列值。在您的示例中,是“ Sam ”和“ Tom ”。

它们没有可以安全预期的特定顺序。它可能是自然顺序,也可能是在数据库中处理它们的顺序(完全取决于数据库实现),也可能是半随机的(例如迭代集合中的项目)。顺序也可能会有所不同,具体取决于结果是从数据中还是从缓存中检索的。

如果您想要特定订单,请将其指定为订单标准:

select distinct Name from Emp order by Name asc

如果您想要不同的值和包含它的第一条记录,请使用group by

select min(ID), Name from Emp group by Name
于 2013-09-03T10:26:02.577 回答
8
MySQL 不同的

一旦找到第一个匹配项,MySQL 就会停止扫描任何未使用的表。

概念

DISTINCT返回第一场比赛,是的!但是返回最后一场比赛呢?关键思想是首先对值进行排序,然后进行区分步骤。可以使用如下语法来完成:

SELECT DISTINCT column_name FROM
(SELECT * FROM table_name ORDER BY column_name DESC)

第一个不同的值

SELECT DISTINCT Name,ID FROM Emp;

与下面的语法相同,但更明确

SELECT DISTINCT generated.Name,generated.ID
FROM
    (
    SELECT Name,ID FROM Emp ORDER BY ID ASC
    ) AS generated
GROUP BY generated.Name
姓名 ID
山姆 1
汤姆 2

最后一个不同的值

SELECT DISTINCT generated.Name,generated.ID
FROM
    (
    SELECT Name,ID FROM Emp ORDER BY ID DESC
    ) AS generated
GROUP BY generated.Name
姓名 ID
山姆 3
汤姆 2

结论

仅使用 ofDISTINCT将返回第一次出现。但是,它可以通过在执行区分步骤之前首先对初始结果进行排序来工作。

于 2018-12-30T20:10:02.227 回答