我正在寻找一个SQL查询,它将返回1或零,具体取决于连接行的内容。
两个表:
活动:
限定符:
每个事件都可以有多个限定符。
我目前的查询是:
select event_id, if(qualifier_type = 15, 1, 0)
from events
join qualifiers q using (event_id)
where q.qualifier_type = 15;
在一个完美的世界中,我会很好地规范化这些表格并将不同的限定词放入事件中,但目前这是不可能的。
编辑:目前,此查询仅返回具有关联的行。相反,我需要返回所有行和一个额外的列,指定此关联是否存在。
答案 0 :(得分:1)
SELECT e.event_id, COUNT(q.qualifier_type) AS needs_qualtype_15
FROM events AS e
LEFT JOIN qualifiers AS q ON q.event_id = e.event_id AND q.qualifier_type = 15
GROUP BY e.event_id
这将为您提供所有事件的列表,并指明限定符类型15是否与事件相关联。
另一种写同样的方法是:
SELECT e.event_id, COUNT(q.qualifier_type) AS needs_qualtype_15
FROM events AS e
LEFT JOIN
(SELECT event_id, qualifier_type
FROM qualifiers WHERE qualifier_type = 15
) AS q
ON q.event_id = e.event_id
GROUP BY e.event_id;
两种配方都依赖于COUNT(expr)
仅计算非空值。对于具有匹配限定符的事件,COUNT为1;对于没有的事件,它是0.第一个版本通过将限定符类型的条件包含在ON连接条件中来压缩查询。第二个版本更清晰,但更冗长。好的优化器可能会以同样的方式执行两个查询。
答案 1 :(得分:0)
Case
When qualifier_type = 15 then 0
Else 1
End
更多信息,http://dev.mysql.com/doc/refman/5.0/en/case-statement.html
答案 2 :(得分:0)
不完全清楚你在追求什么,但试试这个:
SELECT DISTINCT
event_id,
CASE WHEN qualifier_type IS NULL THEN 0 ELSE 1 END AS [ColumnName]
FROM events
LEFT JOIN qualifiers q
WHERE q.qualifier_type = 15;