第一顺序由(条件)然后由(条件)

时间:2015-08-16 19:40:50

标签: mysql

我想根据用户的statut然后根据用户名来命令我的sql请求。法规由user_type列设置:1 =有效,2 =无效,3 =创始人。

我会使用此请求来执行此操作,但它不起作用,因为我希望在“活动”成员中包含活动用户(1)和创建者(3):

SELECT user_type, callsign, username, vid, 0php_hub_chef.hub_id AS id_hub 
FROM 0php_users 
LEFT JOIN phpbb_users ON phpbb_id = phpbb_users.user_id 
LEFT JOIN 0php_hub_chef ON 0php_hub_chef.user_id = phpbb_users.user_id 
WHERE 0php_users.hub_id = 29 
ORDER BY user_type <> 1, username_clean ASC

我想要这样的事情:ORDER BY user_type <> 1 and 3, username_clean ASC

有你的想法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用in

ORDER BY user_type in (1, 3) DESC,
         username_clean ASC

在MySQL中,布尔表达式在整数上下文中被视为整数。如果user_type为1或3,那么此计算结果为1,否则为0 - 因此desc

如果您不喜欢desc,可以使用not in

ORDER BY user_type not in (1, 3), username_clean

答案 1 :(得分:1)

如果您不理解部分IF(user_type <> 1, 0, 1),则可以使用CASE语句编写同一段代码,该语句更具可读性,如下所示。同样,您不必明确说出ASC,因为这是默认的排序方向。

ORDER BY CASE WHEN user_type <> 1 THEN 0 ELSE 1 END, username_clean

基本上代码片段IF(user_type <> 1, 0, 1)可以用伪代码编写,如

if(user_type != 1)
{
  order by 0
}
else
{
  order by 1
}

答案 2 :(得分:1)

请使用ORDER BY IF(user_type = 1, 0, 1) ASC, username_clean ASC代替ORDER BY user_type <> 1, username_clean ASC

user_type的值为1(是活动成员)IF - 函数返回1。否则返回0IF(user_type = 1, 1, 0)的结果将用于排序结果。活动成员(user_type = 1)将位于结果的开头 - 后跟所有其他成员类型。

您可以在文档中找到有关MySQL IF的更多信息: https://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if