mysql - MySQL - 如果字段有值则选择行,否则选择空值
问题描述
我正在尝试使用 user_id 参数创建查询,该参数将为每个 article_id 选择一行,其中设置 user_id 的行具有优先级。例如:
如果 user_id = 1,则应选择 id 为 2、3、4 的行。
如果 user_id = 2,则应选择 id 为 1、3、5 的行。
如果 user_id = 17,则应选择 id 为 1、3、4 的行。
请考虑对 (user_id, article_id) 是唯一的。
id user_id article_id
1 null 8
2 1 8
3 null 9
4 null 10
5 2 10
解决方案
您可以使用此查询:
SELECT *
FROM articles a1
WHERE user_id = 1 OR
user_id IS NULL AND NOT EXISTS(SELECT * FROM articles a2 WHERE a2.article_id = a1.article_id AND a2.user_id = 1)
ORDER BY user_id IS NULL
这将找到所有 match user_id
= 1 的文章,或者NULL
user_id
没有与请求的匹配条目的文章user_id
。结果的顺序user_id IS NULL
是 0 表示匹配 的文章user_id
,1 表示user_id
NULL 的文章,因此优先考虑实际匹配user_id
。
输出(对于user_id=1
):
id user_id article_id
2 1 8
3 (null) 9
4 (null) 10
输出(对于user_id=2
):
id user_id article_id
5 2 10
1 (null) 8
3 (null) 9
输出(对于user_id=17
):
id user_id article_id
1 (null) 8
3 (null) 9
4 (null) 10
推荐阅读
- r - 如何从数据源设置编辑插入 PowerBI 的 R 脚本
- sql - 为什么 QSqlQuery 中的 query->next() 不能按预期工作?
- angular - 检测动画是否在客户端机器上使用了许多资源
- python - 如何使用 numpy 和 pandas 根据条件创建计算
- orbeon - 将 SQL Server 表读入 Orbeon
- excel - 尝试使用列数据比较和 sumif 对 excel 表中的值求和
- python - 将值重新映射到其他值并提供默认值
- reactjs - GraphQL - 数据不能是非输入类型...配置损坏?
- visual-foxpro - 如何在视觉 foxpro 中单击按钮时勾选网格中的所有复选框?
- c++ - 为什么在抛出“范围错误”实例后调用终止():“范围错误”-1