Mysql:仅当列为空时才加入

时间:2013-11-26 16:43:00

标签: mysql sql join conditional

我正在尝试在MySQL中编写一个查询来获取图像列表。问题是,我只想在列不为空时加入另一个表。

图片:

|id|image                                                               |user_id|circle_id|is_deleted|
------------------------------------------------------------------------------------------------------
|1 |cdb10bee27262c597619fdef25bae0eb673f5d5d1b9b33697e40906ad851a25b.jpg|30     |1        |0         |
|2 |9e3213276225b900a3e19262a7761ec3fdf608b95441aa8fbc012f246514d394.jpg|30     |1        |0         |
|3 |a51e104c82de33a804ae0a09e719f3cd7aa205a0830eab4e1e4aa26fd8a6313d.jpg|30     |NULL     |0         |

circles_users:

|id|circle_id|user_id|
----------------------
|1 |1        |31     |

用户:

|id|username|
-------------
|30|elk     |
|31|moose   |

最初,我想出了这个,但经过检查,我意识到它不会起作用。

SELECT images.*
FROM images
    LEFT JOIN circles_users ON circles_users.circle_id = images.circle_id
WHERE (circles_users.user_id = '31' OR images.circle_id IS NULL)
    AND images.user_id = '30'
    AND images.is_deleted = '0'
LIMIT 16

无论如何我似乎无法做到正确,所以我决定写一些 sql来说明我希望实现的目标

SELECT images.*
    FROM images

        CASE
            WHEN images.circle_id IS NOT NULL 
            THEN LEFT JOIN circles_users ON circles_users.circle_id = images.circle_id AND circles_users.user_id = '32'
        END CASE

    WHERE images.user_id = '30'
    AND images.is_deleted = '0'
    LIMIT 16

希望你明白我的意思。谢谢你的帮助。

基本上,我想获取用户发布的所有图片(海报),如果另一个用户在海报共享的圆圈中,或者如果circle_id为空

3 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你应该使用INNER JOIN

答案 1 :(得分:1)

然后将您的查询更改为

SELECT im.*
FROM images im
    LEFT JOIN circles_users cu ON cu.circle_id = im.circle_id AND cu.user_id = '31'
WHERE im.user_id = '30'
    AND im.is_deleted = '0'
LIMIT 16

答案 2 :(得分:0)

我的测试数据存在缺陷,我对sql知识的信任度很高。原始查询是正确的,并按预期工作。

选择图像。* 从图像     LEFT JOIN circles_users ON circles_users.circle_id = images.circle_id WHERE(circles_users.user_id = '31'或images.circle_id为空)     AND images.user_id = '30'     AND images.is_deleted ='0' 限制16

说明 当运行查询时,它将使用user_id = 30获取所有图像。如果circle_id不为null,则它将取消相应的circles_users行,因为它是左连接 Where语句然后检查circles_users.user_id(如果它存在)= 31否则它检查images.circle_id是否为null有效地实现了我的目标。