ステップ:
まず、名前とタイムスタンプでテーブルを注文し、3 user-defined variablesを初期化します。
SELECT s.* FROM status_table s
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
ORDER BY name, timestamp
ご覧のとおり、サブクエリを使用できます。 ORDER BY
は重要です。なぜなら、指定しない限り、リレーショナルデータベースに順序がないからです。
ここで、MySQLは指定された順序でSELECT
句を評価します。したがって、ここでは順序を変更しないでください。あなたはこの文を実行すると
SELECT
s.*,
@prevName,
@prevStatus,
@prevName := s.name,
@prevStatus := s.status
FROM status_table s
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
ORDER BY name, timestamp
、あなたはそれが読まれた最初の行、だときに我々は単に、彼らが前の行の値を保持する変数またはNULLを選択したときにすることを、見ることができます。次に、現在の行の値が変数に割り当てられます。したがって、現在の行を前の行と比較することができます。何かが変更された場合は、3番目の変数を増やします。これは、作成している各「グループ」の番号です。
SELECT
s.*,
@group_number := IF(@prevName != s.name OR @prevStatus != s.status, @group_number + 1, @group_number) AS group_number,
@prevName := s.name,
@prevStatus := s.status
FROM status_table s
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
ORDER BY name, timestamp
それが変化しないように何かが、そうでない場合は、それ自体に変数を変更し、割り当てられたときに、私たちは@group_number
をインクリメント。
これで、このクエリをサブクエリとして使用し、簡単なグループ化を行うことができます。
SELECT
group_number AS id,
name,
status,
MIN(error) AS error,
MIN(timestamp) AS firstEntry,
MAX(timestamp) AS lastEntry,
COUNT(*) AS entries
FROM (
SELECT
s.*,
@group_number := IF(@prevName != s.name OR @prevStatus != s.status, @group_number + 1, @group_number) AS group_number,
@prevName := s.name,
@prevStatus := s.status
FROM status_table s
, (SELECT @group_number := 0, @prevName := NULL, @prevStatus := NULL) var_init_subquery
ORDER BY name, timestamp
) sq
GROUP BY
group_number,
name,
status
で作業どういたしまして良い説明 –
てくれてありがとうを参照してください。 – fancyPants