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