2009-02-28 29 views
2

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

因此,这将返回:

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

目前,它只是选择降序排列所有条目:

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

这很好,但没有可用的,因为我想。

是我想要使用纯MySQL的可能吗?

回答

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; 

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

请注意,即使多个开发人员满足“最近添加的”标准,此查询也可以正常工作;它们在开发者已经出现较长的时间之前以字母顺序出现。


由于最近添加的开发商具有最大developerID,修订后的查询应该是:

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; 
+0

完美。最近添加的开发者是max developerID,并不需要在那里存储日期。但是,这正是我想要的。非常感谢乔纳森。 :) – different 2009-02-28 22:36:45

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

或者其中的一些变体。这个想法是做两部分,第一部分拉出最后一部分。

- MarkusQ

上编辑:反转感(不加),因为你想让它在顶部。

第二次编辑,回复了我对编辑问题的第一次编辑。

+0

您的排序是降序的developerID;请求是字母的,所以应该按照developerName的升序排列,不应该吗? “制造”栏是答案的一部分;你正在使用一个布尔值并假设(可能正确)那个TRUE命令在FALSE之前。 – 2009-02-28 22:38:56

+0

我在编辑问题时经历了一些编辑连环,然后放弃了。在MySQL true == 1和false == 0中,所以这种形式的东西应该让他得到他想要的东西,但细节取决于他究竟想要什么。 – MarkusQ 2009-02-28 22:44:07

+0

不要担心编辑,这只是我意识到我发布了太少的初始信息。人为错误。 :) – different 2009-02-28 22:50:51

2

我认为要做到这一点的最好办法是只是两个查询。显示最近的项目,与常规字母列表分开显示(它会显示两次)。这很容易做到,无论如何可以说是更直观,更实用。否则,如果你真的坚持以你的方式和单个SQL查询,你可以使用UNION ALL和INTERSECT或EXCEPT来做点什么。但是MySQL不保留UNION结果中的任何顺序(见http://dev.mysql.com/doc/refman/5.1/en/union.html),所以这样的查询很可能会变得很难。

1

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

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

这样,您的查询保持简单,但您也实现了“可用性”目标。

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 
相关问题