1

我有一个包含 1 个表的数据库,其中包含以下行:

id      name     date
-----------------------
1       Mike     2012-04-21
2       Mike     2012-04-25
3       Jack     2012-03-21
4       Jack     2012-02-12

我只想提取不同的值,这样我只会得到 Mike 和 Jack 一次。我有一个搜索脚本的代码:

SELECT DISTINCT name FROM table WHERE name LIKE '%$string%' ORDER BY id DESC

但它不起作用。它输出 Mike,Mike,Jack,Jack。

为什么?

4

1 回答 1

6

由于该ORDER BY id DESC子句,该查询被视为编写而成:

SELECT DISTINCT name, id
  FROM table
 ORDER BY id DESC;

除了这些id列不返回给用户(你)。结果集必须包含id才能按它排序。显然,这个结果集有四行,所以这就是返回的内容。(道德:不要按隐藏列排序——除非你知道它会对你的查询做什么。)

尝试:

SELECT DISTINCT name
  FROM table
 ORDER BY name;

(根据心血来潮有或没有 DESC)。这将只返回两行。

如果您需要知道id每个名称的一个,请考虑:

SELECT name, MIN(id)
  FROM table
 GROUP BY name
 ORDER BY MIN(id) DESC;

你可以使用 MAX 来达到同样好的效果。

所有这些都适用于所有 SQL 数据库,包括 MySQL。MySQL 有一些规则允许您省略 GROUP BY 子句,结果有些不确定。我建议不要利用该功能。

很长一段时间(甚至现在)SQL 标准不允许您按不在选择列表中的列进行排序,正是为了避免这样的混淆。当结果集不包含排序数据时,结果集的排序称为“本质排序”;如果排序列都出现在结果集中,这是“无关紧要的排序”,因为您有足够的数据来自己对数据进行排序。

于 2012-04-26T16:43:43.423 回答