0

結合された行の内容に応じて 1 または 0 を返す SQL クエリを探しています。

2 つのテーブル:

イベント:

  • 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)どちらの定式化も、null以外の値のカウントのみに依存しています。修飾子が一致するイベントの場合、COUNTは1です。ないイベントの場合は0です。最初のバージョンは、修飾子タイプの条件をON結合条件に含めることによってクエリを圧縮します。2番目のバージョンはより明確ですが、より冗長です。優れたオプティマイザが両方のクエリを同じ方法で実行する可能性があります。

于 2012-04-22T20:53:39.397 に答える
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 に答える
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 に答える