0

結合されたテーブルの最新の行を取得する方法について、この回答の指示に従おうとしています。

2つのテーブルがあります。

Projects : id, title
Status : project_id, status_id, created(DATETIME)

プロジェクトIDがわかっている場合(例= 2)、最新のステータス更新を選択するための正しいクエリがあります。

SELECT projects. * , project_state_project_map.status_id AS status, 
project_state_project_map.created AS status_created
FROM projects
LEFT JOIN (

    SELECT * 
    FROM project_state_project_map
    WHERE project_id = 2
    ORDER BY created DESC 
    LIMIT 1
    )
project_state_project_map ON project_state_project_map.project_id = projects.id
WHERE projects.id = 2
LIMIT 1

ただし、現在の状態ですべてのプロジェクトを選択する方法がわかりません。すべてのプロジェクトを最新の状態にするには、SQLに何を変更する必要がありますか。

4

1 に答える 1

1

集計関数を使用してステータス付きの最新の日付を取得するようにクエリを変更することをお勧めします。

SELECT p. *, 
  pm1.status_id AS status, 
  pm1.created AS status_created
FROM projects p
LEFT JOIN project_state_project_map pm1
  ON pm1.project_id = p.id
INNER JOIN 
(
  SELECT max(created) MaxDate, project_id
  FROM project_state_project_map
  WHERE project_id = 2
  GROUP BY project_id
) pm2 
  ON pm1.project_id = pm2.project_id
  AND pm1.created = pm2.MaxDate
WHERE p.id = 2

max(created)これにより、各プロジェクトの日付が取得され、この結果を使用して、その日付のステータスが返されます。

これは、次のように書くこともできます。

SELECT p. *, 
  pm.status_id AS status, 
  pm.created AS status_created
FROM projects p
LEFT JOIN
(
  SELECT pm1.project_id,
    pm1.status_id,
    pm1.created
  FROM project_state_project_map pm1
  INNER JOIN 
  (
    SELECT max(created) MaxDate, project_id
    FROM project_state_project_map
    WHERE project_id = 2
    GROUP BY project_id
  ) pm2
    ON pm1.project_id = pm2.project_id
    AND pm1.created = pm2.MaxDate
) pm
  ON pm.project_id = p.id
WHERE p.id = 2;
于 2013-03-06T14:15:24.797 に答える