我有这个查询,通过回调检查我是否已经在其他网站上投票,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
的结果。
答案 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
。唯一的问题是价值何时为NULL
或s.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
子句中将条件放在第一个表上会产生特殊效果。当没有匹配时,该行仍然包含在输出中,只是没有来自另一个表的任何匹配列。