你能在ORDER BY中添加一个if语句吗?

JM4*_*JM4 35 php mysql sorting

我想要实现以下目标:

我有一个ORDER BY语句,它可能会根据存储在A列中的值而有所不同.

例如:

如果Type为Member,如果Type为Group,则按成员姓氏排序,按Group Name排序

都按升序排列.

我对最终陈述的最佳猜测是:

SELECT * 
  FROM table 
 WHERE STATUS = 'Active' 
 ORDER BY ((LNAME if TYPE = 'Member') OR (GROUPNAME if TYPE = 'Group')) ASC
Run Code Online (Sandbox Code Playgroud)

我知道这是不正确的,但无法在其他地方找到信息.有任何想法吗?

irc*_*ell 65

好吧,你可以在MySQL中使用这个IF 函数(注意强调function因为还有一个不相关的IF语句)...:

ORDER BY IF(TYPE='Member', LNAME, GROUPNAME) ASC
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,似乎更好的选择(从灵活性的角度来看)将是CASE声明:

ORDER BY 
    CASE `type` 
        WHEN 'Member' THEN LNAME 
        WHEN 'Group' THEN GROUPNAME
        ELSE 1 END 
    ASC
Run Code Online (Sandbox Code Playgroud)

注意,从整个块CASEEND将被认为是作为一个单一的"单元".结果就是你要反对的东西(因此为什么它ASC会在块之后,而不是在它内部)......


And*_*ndy 11

使用CASE语句.

来自http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html的示例:

SELECT id, first_name, last_name, birthday
FROM table
ORDER BY
-- numeric columns
CASE _orderby WHEN 'id' THEN id END ASC,
CASE _orderby WHEN 'desc_ id' THEN id END DESC,
-- string columns
CASE _orderby WHEN 'first_name' THEN first_name WHEN 'last_name' THEN last_name END ASC,
CASE _orderby WHEN 'desc_first_name' THEN first_name WHEN 'desc_last_name' THEN last_name END DESC,
-- datetime columns
CASE _orderby WHEN 'birthday' THEN birthday END ASC,
CASE _orderby WHEN 'desc_ birthday' THEN birthday END DESC;
Run Code Online (Sandbox Code Playgroud)

  • 这种方法对我来说是最好的,因为它可以灵活地让你单独设置ASC/DESC而不是整个组. (3认同)