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

这将找到与user_id= 1 匹配的所有文章,或者与请求的user_id没有匹配条目的NULLuser_id。结果按user_id IS NULL排序,对于与user_id匹配的文章,user_id为 NULL 的文章为 0,因此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