php - MySQL是否可以按某一列排序,但如果另一列的值为X,则将其放在最后?
问题描述
我有 3 张桌子users
,,,,warnings
。warningnames
表格内容如下:
用户(简体):
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
最后?
解决方案
如果我理解它,您想按警告计数排序,但忽略该查询中 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 添加到查询中
推荐阅读
- flutter - 即使在 Flutter 中弹出父窗口小部件屏幕,如何渲染仍将运行的 webview?
- python - Matplotlib 无法在 Windows 10 上运行——DLL 无法加载
- java - 使用 2 个 BufferedReaders 读取 1 个文件
- android - 在 Xamarin App 中集成参考点/SmartcardSDK
- visual-studio-code - 我在安装 Visual Studio 时遇到问题
- r - apply(ifelse(....mean, 0)) 代表错误(是,length.out = len):尝试复制“闭包”类型的对象
- flutter - Flutter ListView 与 Row 之间的空间属性
- openshift - 如何将部署或应用程序从现有项目克隆到 openshift 中新创建的项目
- power-bi-report-server - 在 Power bi 报告服务器上托管的移动电源 bi 应用程序特定的 power bi 报告中打开
- amazon-web-services - AWS 预签名网址