MySQL select distinct不起作用

时间:2012-04-26 16:30:03

标签: mysql

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

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

我想只提取不同的值,这样我才能获得迈克和杰克一次。 我有一个搜索脚本的代码:

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

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

为什么?

1 个答案:

答案 0 :(得分:4)

由于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标准不允许您按照不在选择列表中的列进行排序,正是为了避免这种混淆。当结果集不包括排序数据时,结果集的排序称为“基本排序”;如果排序列全部出现在结果集中,那么它是“非必要的排序”,因为您有足够的数据来自行订购数据。