我有一个小问题。我正在使用SQL数据库的结果填充选择标记。我想要的是最后一个作为顶部条目添加,其余按字母顺序排序。
所以它会回来:
*----------*-------------*
developerID|developerName
*----------*-------------*
| 40 | ZZZ Dev |
| 39 | A Dev |
| 38 | Be New Dev |
*----------*-------------*
目前它只是按降序选择所有条目:
"SELECT developerName, developerID FROM developer ORDER BY developerID DESC"
哪个好,但不像我想的那样可用。
使用纯MySQL是我想要的吗?
答案 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
在编辑时:颠倒感觉(不添加)'因为你想要它在顶部。
第二次修改,恢复了我的第一次修改以回复您对该问题的修改。