仅加入特定行

时间:2012-04-22 20:46:03

标签: mysql join

我正在寻找一个SQL查询,它将返回1或零,具体取决于连接行的内容。

两个表:

活动:

  • event_id
  • 描述符

限定符:

  • qualifier_id
  • event_id的
  • qualifier_type

每个事件都可以有多个限定符。

我目前的查询是:

select event_id, if(qualifier_type = 15, 1, 0)
from events 
join qualifiers q using (event_id)
where q.qualifier_type = 15;

在一个完美的世界中,我会很好地规范化这些表格并将不同的限定词放入事件中,但目前这是不可能的。

编辑:目前,此查询仅返回具有关联的行。相反,我需要返回所有行和一个额外的列,指定此关联是否存在。

3 个答案:

答案 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;