SQL查询仅返回一行结果,需调整以满足指定排序与筛选规则
问题与解决方案
问题描述
我拥有profile和jobs两张表,当前使用的SQL查询如下:
SELECT COUNT(jobs.id) as jobs_completed, profile.rating, profile.id FROM profile JOIN jobs ON jobs.user_id = profile.user_id AND jobs.ended <> 0 WHERE profile.whoami = 'contractor' HAVING jobs_completed > 5 ORDER BY rating DESC, jobs_completed DESC LIMIT 6
输入数据集
| id | jobs_completed | rating |
|---|---|---|
| 1 | 52 | 2.8 |
| 2 | 16 | 4.6 |
| 3 | 1 | 5.0 |
| 4 | 8 | 4.7 |
| 5 | 12 | 4.3 |
| 6 | 5 | 4.9 |
| 7 | 26 | 4.4 |
| 8 | 57 | 4.9 |
预期输出数据集
| id | jobs_completed | rating |
|---|---|---|
| 8 | 57 | 4.9 |
| 4 | 8 | 4.7 |
| 2 | 16 | 4.6 |
| 7 | 26 | 4.4 |
| 5 | 12 | 4.3 |
| 6 | 5 | 4.9 |
当前查询仅返回1行结果,与预期的6行不符。需要修改查询实现:
- 排序规则:最高rating优先,其次最高jobs_completed优先
- 筛选规则:优先选取
jobs_completed > 5的记录,当这类记录不足6条时,补充jobs_completed <=5的记录
修改后的SQL
WITH ranked_contractors AS ( SELECT COUNT(jobs.id) as jobs_completed, profile.rating, profile.id, CASE WHEN COUNT(jobs.id) > 5 THEN 1 ELSE 0 END AS priority FROM profile JOIN jobs ON jobs.user_id = profile.user_id AND jobs.ended <> 0 WHERE profile.whoami = 'contractor' GROUP BY profile.id, profile.rating ) SELECT id, jobs_completed, rating FROM ranked_contractors ORDER BY priority DESC, rating DESC, jobs_completed DESC LIMIT 6;
逻辑说明
- 通过CTE计算每个承包商的完成任务数,同时新增
priority字段标记是否符合jobs_completed >5的条件,符合则标记为1,否则为0 - 排序时先按
priority降序,确保符合条件的记录排在最前面 - 再按
rating和jobs_completed降序排序,满足要求的优先级规则 - 最后取前6条记录:当符合
jobs_completed >5的记录不足6条时,自动补充不符合条件的记录,直到凑满6条
内容的提问来源于stack exchange,提问作者StartupNation
相关产品推荐
相关产品推荐

