0

我正在寻找一个 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;

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

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

4

3 回答 3

2
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 连接条件中来压缩查询。第二个版本更清晰,但更冗长。一个好的优化器很有可能会以相同的方式执行这两个查询。

于 2012-04-22T20:53:39.397 回答
0
Case
    When qualifier_type = 15 then 0
    Else 1
End

更多在这里,http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

于 2012-04-22T20:49:36.547 回答
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;
于 2012-04-22T20:53:27.047 回答