ホームページ > データベース > mysql チュートリアル > Inner Join と LIMIT を使用して各サービスの最新ステータスを取得するにはどうすればよいですか?

Inner Join と LIMIT を使用して各サービスの最新ステータスを取得するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-04 12:02:35
オリジナル
334 人が閲覧しました

How to Retrieve the Latest Status for Each Service Using Inner Join and LIMIT?

内部結合と LIMIT を使用した 2 つのテーブルからの選択

サービスとステータスの 2 つのテーブルで各サービスの最新ステータスを取得するには、内部結合を利用できます。

参考までに、既存のテーブルは:

  • サービス:

    • 列:

      • id: 整数
      • 名前:文字列
  • ステータス:

    • 列:

      • id: 整数
      • ステータス: String
      • service_id: Integer
      • timestamp: DateTime

望ましい結果は各サービスの最新ステータスです、以下に示すように:

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート