首页 > 解决方案 > 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

标签: mysql

解决方案


您可以使用此查询:

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_idNULL 的文章,因此优先考虑实际匹配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

推荐阅读