0

この質問について、私はうまくいった答えを受け取りました。私は今、より良い構造が可能かどうか疑問に思っています。

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

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

プロジェクトのステータスを取得する時点で、プロジェクトIDを取得し、プロジェクトIDに基づいてステータステーブルから最新の行を取得します。この最新の行を取得するのは非常に面倒です。

スキーマをこれに変更する必要がありますか?

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

次に、FKを使用してテーブルを結合し、最新のものを探すことなく、必要な行を取得できますか?

編集

だから私はこのようなものが欲しい

SELECT * FROM projects
LEFT JOIN status on projects.id = status.project_id
WHERE projects.id = 1

ただし、ステータステーブルの最新のレコードのみが必要です。

編集2

だから私はこのようなものが欲しい

SELECT * FROM projects
LEFT JOIN status on projects.id = status.project_id

ただし、返されたプロジェクトごとに、statusからそのproject_idの最新のステータスレコードのみを取得します。

4

2 に答える 2

1

これはどのように面倒ですか?

SELECT project_id, status_id, created 
FROM Status 
WHERE project_id = the-id
ORDER BY created DESC
LIMIT 1;

または、複数のプロジェクトのリストが必要な場合:

SELECT a.project_id, a.status_id, a.created 
FROM Status a
LEFT JOIN Status b
ON a.project_id = b.project_id
AND b.created > a.created
WHERE a.project_id IN(id1, id2, id3) AND b.project_id IS NULL;

したがって、プロジェクトデータを使用すると:

SELECT Projects.*, Status.*
FROM Projects
LEFT JOIN Status 
ON Status.project_id = Projects.id
WHERE Projects.id = the-id
ORDER BY Status.created DESC
LIMIT 1;

または:

SELECT Projects.*, Status.*
FROM Projects
LEFT JOIN Status a
ON a.project_id = Projects.id
LEFT JOIN Status b
ON a.project_id = b.project_id
AND b.created > a.created
WHERE b.project_id IS NULL;
于 2013-03-06T21:01:06.937 に答える
1

それはそれを行う1つの方法です。

current_status フィールドを FK にする必要さえないかもしれません。なぜ値を保存しないのですか?そうしないと、奇妙な循環参照に陥る可能性があります。

もう 1 つの方法は、projects テーブルとは別にステータス アーカイブを保存することです。ステータスが変わるたびに、現在のステータスをアーカイブ テーブルに挿入し、projects.status の値を変更します。

于 2013-03-06T21:04:26.067 に答える