SQL查询按字母顺序排序所有结果除外?

时间:2009-02-28 22:23:56

标签: mysql

我有一个小问题。我正在使用SQL数据库的结果填充选择标记。我想要的是最后一个作为顶部条目添加,其余按字母顺序排序。

所以它会回来:

*----------*-------------*
developerID|developerName
*----------*-------------*
| 40       | ZZZ Dev     |
| 39       | A Dev       |
| 38       | Be New Dev  |
*----------*-------------*

目前它只是按降序选择所有条目:

"SELECT developerName, developerID FROM developer ORDER BY developerID DESC"

哪个好,但不像我想的那样可用。

使用纯MySQL是我想要的吗?

5 个答案:

答案 0 :(得分:9)

假设定义添加开发人员的列是developerAdded(某种时间戳):

SELECT developerName, developerID, 1 AS ordering
    FROM developer
    WHERE developerAdded =  (SELECT MAX(developerAdded)
                                FROM developer)
UNION
SELECT developerName, developerID, 2 AS ordering
    FROM developer
    WHERE developerAdded != (SELECT MAX(developerAdded)
                                FROM developer)
ORDER BY ordering, developername;

如果还有其他一些神奇的方法来确定最近添加的开发者(例如最大的开发者ID),请相应地调整子查询。

请注意,即使多个开发人员满足“最近添加的”标准,此查询也能正常运行;它们出现在按字母顺序排列的开发人员之前。


由于最近添加的开发人员具有最大的开发者ID,因此修订后的查询应为:

SELECT developerName, developerID, 1 AS ordering
    FROM developer
    WHERE developerID =  (SELECT MAX(developerID) FROM developer)
UNION
SELECT developerName, developerID, 2 AS ordering
    FROM developer
    WHERE developerID != (SELECT MAX(developerID) FROM developer)
ORDER BY ordering, developername;

答案 1 :(得分:2)

我认为最好的方法就是两个查询。显示与常规字母列表分开的最新项目,它也会出现(因此它显示两次)。无论如何,这很容易做到并且可以说更直观和可用。

否则,如果您真的坚持按照自己的方式并使用单个SQL查询,则可以使用UNION ALL和INTERSECT或EXCEPT进行烹饪。但MySQL并没有在UNION的结果中保留任何类型的顺序(参见http://dev.mysql.com/doc/refman/5.1/en/union.html),因此这样的查询可能会变得很难看。

答案 2 :(得分:1)

我建议不要尝试更改列表中项目的排序顺序,因为这会更改用户对列表的“预期行为”。

如果该页面的最常见用途通常是“最后添加”名称,则可以在列表中进行“默认”选择。因此,当页面出现时,列表中已经选择了最后添加的条目 - 但如果它们打开列表,则所有条目仍然按字母顺序排列,并且它将按预期运行。

这样您的查询就会变得简单,但您也可以实现“可用性”目标。

答案 3 :(得分:1)

另一种解决方案WHERE main是时间戳,它设置FIRST项目,其他按字母顺序按地点名称排序。

ORDER BY main=(SELECT MAX(main) FROM places WHERE user_ID = 7) DESC,place ASCSELECT ID,place,main FROM places WHERE user_ID = 7

答案 4 :(得分:0)

SELECT developerName, developerID 
  FROM developer 
  ORDER BY developerID = {last_used},developerID DESC

或者某些变体。这个想法是做两部分排序,第一部分拉出最后一部分。

- MarkusQ

在编辑时:颠倒感觉(不添加)'因为你想要它在顶部。

第二次修改,恢复了我的第一次修改以回复您对该问题的修改。