MySQL で Group By を使用して最新の値のみを選択する
テーブルから各メンバーの最新の出席状況を取得しようとすると、単純な GROUP BY クエリを使用して最後の出席者ではなく最初の出席者を取得する状況が発生する可能性があります。この問題を解決するには、いくつかの方法があります。
サブクエリの使用
サブクエリを使用して各メンバーの最大タイムスタンプを検索し、元のテーブルに結合できます。そのタイムスタンプに基づいて、対応する出席状況を取得します。
<code class="sql">SELECT id_branch_channel, id_member, attendance, timestamp, id_member FROM view_event_attendance AS t1 WHERE id_event = 782 AND timestamp = ( SELECT MAX(timestamp) FROM view_event_attendance AS t2 WHERE t1.id_member = t2.id_member AND t1.id_event = t2.id_event GROUP BY id_event, id_member ) OR timestamp IS NULL GROUP BY id_event, id_member;</code>
派生テーブルの使用
タイムスタンプによって行を降順に並べる派生テーブルを作成できます。次に、そのテーブルを GROUP BY クエリのソースとして使用します。
<code class="sql">SELECT id_branch_channel, id_member, attendance, timestamp, id_member FROM ( SELECT id_branch_channel, id_member, attendance, timestamp, id_member FROM view_event_attendance WHERE id_event = 782 ORDER BY timestamp DESC ) AS sorted GROUP BY id_event, id_member;</code>
ウィンドウ関数の使用
ウィンドウ関数を使用して、全体の最大値を見つけることができます。各メンバーの行を作成し、その最大値を使用して行をフィルタリングします。
<code class="sql">SELECT id_branch_channel, id_member, attendance, timestamp, id_member FROM ( SELECT id_branch_channel, id_member, attendance, timestamp, id_member, MAX(timestamp) OVER (PARTITION BY id_event, id_member) AS max_timestamp FROM view_event_attendance WHERE id_event = 782 ) AS subquery WHERE timestamp = max_timestamp GROUP BY id_event, id_member;</code>
文字列連結トリックの使用
このアプローチには、タイムスタンプと出席を連結することが含まれます。単一の文字列を使用し、MAX() 関数を使用して最大の文字列を検索します。最大文字列から出席者を抽出することで、最新の出席者を効果的に取得できます。
<code class="sql">SELECT id_branch_channel, id_member, SUBSTR(MAX(CONCAT(FROM_UNIXTIME(timestamp), attendance)), 20) AS attendance, timestamp, id_member FROM view_event_attendance WHERE id_event = 782 GROUP BY id_event, id_member;</code>
特定の状況に最適なアプローチは、データベースのパフォーマンス特性とデータセットのサイズによって異なります。
以上がMySQL で各メンバーの最新の出席状況を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。