SQL检查是否存在于其他表中,如果不存在则检查其类型

时间:2014-06-01 13:24:34

标签: mysql sql

我有这个查询,通过回调检查我是否已经在其他网站上投票,you can read more about this here

SELECT sites.*, callback_votes.site_id AS voted
FROM sites
LEFT JOIN callback_votes
ON callback_votes.site_id = sites.id
AND callback_votes.ip = '127.0.0.1'
ORDER BY sites.id DESC

但是现在我陷入了两难境地,如果它的类型等于“没有”,我需要设置为site_id

因此,查询会看到site.type是否等于'无',然后将site.id设置为已投票,否则查看表callback_votes上是否有id并将其设置为{ {1}},就像现在在查询中一样。

我该怎么做?如果我将使用WHERE语句,它将仅显示site_id的结果。

1 个答案:

答案 0 :(得分:1)

您在寻找case声明吗?

SELECT s.*, 
       (case when s.type = 'none' then s.id else cb.site_id end) as voted
FROM sites s LEFT JOIN
     callback_votes cb
     ON cb.site_id = s.id AND cb.ip = '127.0.0.1'
ORDER BY s.id DESC;

我发现逻辑的描述有点难以理解,因为cb.site_id = s.id。唯一的问题是价值何时为NULLs.id

如果您想在这种情况下忽略投票,那么您也可以在on子句中包含条件:

SELECT s.*, 
       (case when s.type = 'none' then s.id else cb.site_id end) as voted
FROM sites s LEFT JOIN
     callback_votes cb
     ON cb.site_id = s.id AND cb.ip = '127.0.0.1' AND s.type <> 'none'
ORDER BY s.id DESC;

请注意,在on子句中将条件放在第一个表上会产生特殊效果。当没有匹配时,该行仍然包含在输出中,只是没有来自另一个表的任何匹配列。