我有投票网站,其中每个网站都是表格中的一行。现在在我的网络服务器上,我需要加载所有网站,并检查每个网站是否已经投票(投票意味着网站ID存在于其他表格的行中)。
因此,如果site_id
中存在网站ID = 5和callback_votes
5行,则查询会将该ID添加到'voted'
,否则将为空。
示例:
SELECT sites.*, callback_votes.site_id AS voted
FROM sites
INNER JOIN callback_votes ON callback_votes.site_id = sites.id;
此查询有效,但是,如果callback_votes
中没有任何行,则查询将不返回任何数据。我想做什么,我仍然想要返回sites.*
,只是因为voted
在这种情况下为空。
这可能还是有其他办法吗?
答案 0 :(得分:2)
您正在使用INNER JOIN
,它将返回每个表中存在匹配行的行,您需要的是LEFT JOIN
。
在简单术语中使用LEFT JOIN
意味着"从左表中选择所有行,右表中没有匹配的行然后返回null"。
以下是您的查询的外观:
SELECT sites.*, callback_votes.site_id AS voted
FROM sites
LEFT JOIN callback_votes ON callback_votes.site_id = sites.id;
答案 1 :(得分:0)
只使用left join而不是inner来获取来自站点的所有数据,如果不是回调投票则使用null值
SELECT sites.*, callback_votes.site_id AS voted
FROM sites
LEFT JOIN callback_votes ON callback_votes.site_id = sites.id;
答案 2 :(得分:0)
尝试LEFT JOIN
SELECT sites。*,callback_votes.site_id AS voteed,
ISNULL时的情况(callback_votes.site_id,'')=''然后没有' ELSE'是'结束IS_SITE_VOTED
FROM sites LEFT JOIN callback_votes ON callback_votes.site_id = sites.id;
CASE适用于SQL-Server,您可以将IF用于MYSQL。