sql - 在相邻表中定义顺序的 SQL 查询表
问题描述
我需要从表中返回不同的记录,accounts
首先显示设备处于状态的项目off
。
所以结果应该是:
我试图对记录进行分组
SELECT account.id, account.name FROM account
LEFT JOIN devices ON account.id = devices.account_id
GROUP BY account.id, devices.status
ORDER BY devices.status desc
但它account # 2
在列表中出现了两次,因为它有两个on/off
设备
解决方案
您基本上可以进行基于条件聚合的排序。以下查询将对帐户是否关闭任何设备进行一级排序。所有至少有一台设备的账户都off
被认为是同一级别的排序。第二级排序在account_id
(用于打破平局)完成。
SELECT account.id, account.name
FROM account
LEFT JOIN devices ON account.id = devices.account_id
GROUP BY account.id, account.name
ORDER BY MAX(CASE devices.status WHEN 'off' THEN 1 ELSE 0 END) DESC,
account.id
SQL Fiddle 演示(感谢@Martin)
现在,如果您希望帐户顶部的“关闭”设备数量最多,我们可以使用以下查询:
SELECT account.id, account.name
FROM account
LEFT JOIN devices ON account.id = devices.account_id
GROUP BY account.id, account.name
ORDER BY SUM(CASE devices.status WHEN 'off' THEN 1 ELSE 0 END) DESC,
account.id
推荐阅读
- html - 将多行与父 div 垂直对齐
- go - Go 函数可以检查有多少返回值被消耗了吗?
- mysql - MySQL/PostgreSQL 是否缓存查询的解析/编译?
- android - SQLite 从活动中获取用户 ID 和数据
- c# - 使用复制命令时找不到部分路径
- javascript - 如何在一个 submitHandler 中两次更新反应状态
- javascript - 禁用页面上具有多个表单的引导提交按钮
- c# - 如何使用 Visual Studio Code 查看 .dll 文件的所有元数据?
- sqoop - 如果源表没有时间戳列,如何使用 Sqoop 增量 lastmodified。
- javascript - 获取 youtube 音乐视频元数据