MySQL select distinct不起作用

MySQL select distinct不起作用,mysql,Mysql,我有一个数据库,其中有一个表,表中有以下行: 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

我有一个数据库,其中有一个表,表中有以下行:

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
但它不起作用。它输出迈克,迈克,杰克,杰克

为什么?

由于ORDER BY id DESC子句,查询被视为是编写的:

SELECT DISTINCT name, id
  FROM table
 ORDER BY id DESC;
但id列不会返回给您所访问的用户。结果集必须包含id才能按其排序。显然,这个结果集有四行,所以这就是返回的结果。寓意:不要按隐藏列排序——除非你知道它将对你的查询做什么

尝试:

根据突发奇想有或没有描述。这将只返回两行

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

SELECT name, MIN(id)
  FROM table
 GROUP BY name
 ORDER BY MIN(id) DESC;
你可以用MAX来达到同样好的效果

所有这些都适用于所有SQL数据库,包括MySQL。MySQL有一些规则,允许您省略具有某种不确定性结果的GROUPBY子句。我建议不要利用这个特性

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

由于order BY id DESC子句,查询被视为是编写的:

SELECT DISTINCT name, id
  FROM table
 ORDER BY id DESC;
但id列不会返回给您所访问的用户。结果集必须包含id才能按其排序。显然,这个结果集有四行,所以这就是返回的结果。寓意:不要按隐藏列排序——除非你知道它将对你的查询做什么

尝试:

根据突发奇想有或没有描述。这将只返回两行

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

SELECT name, MIN(id)
  FROM table
 GROUP BY name
 ORDER BY MIN(id) DESC;
你可以用MAX来达到同样好的效果

所有这些都适用于所有SQL数据库,包括MySQL。MySQL有一些规则,允许您省略具有某种不确定性结果的GROUPBY子句。我建议不要利用这个特性


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

它不选择distinct,它输出所有的名称,甚至是重复的。如果您的输出是唯一的名称,那么为什么要使用ORDER By id。除此之外,您正在使用的SQL看起来与您所要求的是正确的。请尝试以下操作:从表中选择不同的名称,其中的名称(如“%$string%”)按名称描述排序。不同的日期值可能会导致此问题。如果要查找名称列表,请删除WHERE子句。i、 e:按名称描述从表顺序中选择不同的名称,或者如果您只希望列表按升序排列:从中选择不同的名称table@Linger,对此我不知道任何可能的解释,除了给出一个奇怪的答案:Pit不选择distinct,它输出所有的名称,甚至是重复的。如果您的输出是唯一的名称,那么为什么要使用ORDER By id。除此之外,您正在使用的SQL看起来与您所要求的是正确的。请尝试以下操作:从表中选择不同的名称,其中的名称(如“%$string%”)按名称描述排序。不同的日期值可能会导致此问题。如果要查找名称列表,请删除WHERE子句。i、 e:按名称描述从表顺序中选择不同的名称,或者如果您只希望列表按升序排列:从中选择不同的名称table@Linger,对此我不知道任何可能的解释,除了给出一个奇怪的答案:P