MySQL - 选择具有指定ID或null的结果

Pav*_*l K 5 mysql

我有一张桌子:

| ID | ADV_ID | USER_ID |
| 1  |   22   |   NULL  |
| 2  |   22   |    3    |
| 5  |   44   |   NULL  |
Run Code Online (Sandbox Code Playgroud)

现在,我想选择行adv_id = 22和哪里user_id = 3.如果该行不存在,我想在哪里获取行adv_id = 22user_id is null.

我试过这样的方式:

SELECT * FROM `table` WHERE adv_id = 22 AND (user_id = 3 OR user_id is null)
Run Code Online (Sandbox Code Playgroud)

但是这个查询返回两行 - with user_id = NULL和with user_id = 3.我想得到一行 - user_id = 3或者(或者如果不存在的话)user_id = NULL.

我怎么能在一个查询中做到这一点?谢谢.

Tim*_*sen 5

使用条件聚合:

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT
        ADV_ID,
        CASE WHEN COUNT(CASE WHEN USER_ID = 3 THEN 1 END) > 0 THEN 3 END USER_ID
    FROM yourTable
) t2
    ON t1.ADV_ID = t2.ADV_ID AND
       ((t1.USER_ID IS NULL AND t2.USER_ID IS NULL) OR (t1.USER_ID = t2.USER_ID))
WHERE
    t1.ADV_ID = 22;
Run Code Online (Sandbox Code Playgroud)

演示

为了解释,我将子查询别名作为t2聚合ADV_ID,并输出值,3如果该值出现在一个或多个记录中,否则输出NULL.然后,我们将此子查询连接回原始表,条件是两个USER_ID值都是NULL,或者如果不USER_ID匹配,则两个值匹配.

您可以修改演示以查看它为其他输入生成所需的输出.