首页 > 解决方案 > MySQL是否可以按某一列排序,但如果另一列的值为X,则将其放在最后?

问题描述

我有 3 张桌子users,,,,warningswarningnames

表格内容如下:

用户(简体):

u_id, username, password, rank

警告:

w_id, wn_id, u_reporter_id, u_reported_id

警告名称:

wn_id, warningInfo, warningPoints

我在 PHP 中有一个循环,它让我通过一个简单的查询获得所有用户:

SELECT *
FROM users 
WHERE u_id < :startcount 
ORDER BY u_id DESC 
LIMIT :perpage 

如何进行查询以获取所有用户,但将警告最多的用户放在顶部,将排名为 0 的用户放在底部?

到目前为止我的查询是:

SELECT users.*, COUNT(warnings.w_id) as warningCount
FROM users 
LEFT JOIN warnings 
ON users.u_id = u_reported_id 
WHERE u_id < :startcount 
ORDER BY warningCount DESC
LIMIT :perpage

但这不会返回我想要的,它只是warningCount在一个适合该WHERE语句的查询中返回所有用户。

小提琴示例:

http://sqlfiddle.com/#!9/ec6c2d/6

示例 PHP 代码:

<?php
$query = $this->handler->prepare('SELECT * FROM users WHERE u_id < :startcount ORDER BY u_id DESC LIMIT :perpage');
try{
    $query->execute([
        ':startcount'   => 25,
        ':perpage'      => 25
    ]);
}
catch(PDOException $e){
    echo $e->getMessage();
}

while($fetch = $query->fetch(PDO::FETCH_ASSOC)){
    echo $fetch['username'] . '<br />';
}
?>

如何更正此问题并按warningCount列排序,但将所有用户都放在rank最后?

标签: phpmysql

解决方案


如果我理解它,您想按警告计数排序,但忽略该查询中 rank = 0 的用户?如果是这样的话,你需要的是分组,然后使用 case when 排序,这就是我想出的:

SELECT users.*, COUNT(warnings.w_id) as warningCount
FROM users 
LEFT JOIN warnings 
ON users.u_id = u_reported_id 
  WHERE u_id < 10 
group by users.u_id
ORDER BY 
  case when rank = 0 
  then 0 
  else COUNT(warnings.w_id) + 1
  end
DESC
LIMIT 25

我在 order by 中添加 +1 以确保排名为 0 的用户始终位于底部。

编辑 :

  • 我将 where startCount 和 limit 添加到查询中

推荐阅读