2012-04-26 95 views
1

我有1个表的数据库具有以下行:MySQL的选择不同不起作用

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 

但它不工作。它输出迈克,迈克,杰克,杰克。

为什么?

+3

你的问题是什么? – eggyal 2012-04-26 16:31:06

+0

它不会选择不同的,它输出所有的名称,甚至重复 – bizkit1 2012-04-26 16:32:40

+0

如果你的输出只是名称,那么你为什么使用ORDER BY ID。除此之外,你正在使用的SQL看起来正确的是你所要求的。请尝试以下操作:** SELECT DISTINCT名称FROM表名称LIKE'%$ string%'ORDER BY name DESC ** – Linger 2012-04-26 16:34:48

回答

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标准不允许您按不在选择列表中的列进行排序,这正是为了避免这样的混淆。当结果集不包含排序数据时,结果集的排序称为“基本排序”;如果排序列全部出现在结果集中,则它是“无关紧要的排序”,因为您有足够的数据来自己排序数据。