我正在尝试在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为空
答案 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有效地实现了我的目标。