内部結合と LIMIT を使用した 2 つのテーブルからの選択
サービスとステータスの 2 つのテーブルで各サービスの最新ステータスを取得するには、内部結合を利用できます。
参考までに、既存のテーブルは:
サービス:
列:
ステータス:
列:
望ましい結果は各サービスの最新ステータスです、以下に示すように:
id | name | status | timestamp |
---|---|---|---|
1 | Test1 | OK | October, 15 2015 09:08:07 |
2 | Test2 | OK | October, 15 2015 10:15:23 |
前のステートメントには最新のステータスを取得する際の制限:
SELECT ser.id, ser.name, a.status, a.timestamp from Service ser inner join (select * from status order by Status.timestamp DESC limit 1) as a on a.service_id = ser.id
最新のステータスを正しく選択するには、各サービスの最大タイムスタンプを識別するサブクエリが必要です:
SELECT service_id, MAX(timestamp) AS MaxDate FROM status GROUP BY service_id
このサブクエリservice_id と MaxDate の 2 つの列を持つ新しいテーブルを作成します。 MaxDate 列は、各サービスの最新のタイムスタンプを表します。
このサブクエリを使用すると、メイン クエリを変更して、Service テーブルを最大タイムスタンプ テーブルと結合できます。
SELECT ser.id, ser.name, s.status, s.timestamp FROM Service ser INNER JOIN status as s ON s.service_id = ser.id INNER JOIN ( SELECT service_id, MAX(timestamp) AS MaxDate FROM status GROUP BY service_id ) AS a ON a.service_id = s.service_id AND a.MaxDate = s.timestamp;
By join on service_id と MaxDate の両方では、各サービスの最新のステータスのみが表示され、望ましい結果が保証されます。
以上がInner Join と LIMIT を使用して各サービスの最新ステータスを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。