2009-07-29 12 views
0

私たちはオンラインプロジェクト管理システムを使用していますが、私はそれをやや拡張しようとしています。SQLマルチテーブルクエリの支援 - 重複結果の返信

それは関心の次のテーブルを持っている

 
todo_itemStatus: 
+--------------+-----------------------+------+-----+---------------------+----------------+ 
| Field  | Type     | Null | Key | Default    | Extra   | 
+--------------+-----------------------+------+-----+---------------------+----------------+ 
| itemStatusId | bigint(20) unsigned | NO | PRI | NULL    | auto_increment | 
| itemId  | int(10) unsigned  | NO | MUL | 0     |    | 
| statusDate | datetime    | NO |  | 0000-00-00 00:00:00 |    | 
| statusKey | tinyint(3) unsigned | NO |  | 0     |    | 
| memberId  | mediumint(8) unsigned | NO |  | 0     |    | 
+--------------+-----------------------+------+-----+---------------------+----------------+ 

このテーブルには、タスクが完了したときを追跡し、また、すべてのタスクの変更の状態を保持します。

プロジェクトテーブルとアイテム(またはタスク)テーブルがあります。

私は基本的には、プロジェクトのリストを抽出し、完了したタスクの割合の詳細を抽出できるようにしたいと考えています。しかし、プロジェクトの各タスクを完了したかどうかについての詳細を列挙できるだけであれば、今は幸せです。

私が知っている限り、タスクの最新ステータスを取得する最善の方法は、statusDateが最新であるtodo_itemStatusを選択することです。itemItemはitemIdがタスクと等しいときにitemStatusIdが最大です興味がある。

<pre> 
select todo_item.itemId, todo_item.title, todo_itemStatus.statusKey, todo_itemStatus.statusDate 
from todo_item, todo_project, todo_itemStatus 
where todo_item.projectId = todo_project.projectId 
and todo_project.projectId = 13 
and todo_itemStatus.itemId = todo_item.itemId 
and todo_itemStatus.statusDate = (
    select MAX(todo_itemStatus.statusDate) 
    from todo_itemStatus key1 where todo_itemStatus.itemId = key1.itemId); 
</pre> 

はしかし、これは次のように出力して、すべてのステータスの更新情報が得られます:

私はこのようなクエリを試してみました、私は一つだけをしたいと私は、欲しいものではありません

 
+--------+-----------------------------------------------------------------------------+-----------+---------------------+ 
| itemId | title                  | statusKey | statusDate   | 
+--------+-----------------------------------------------------------------------------+-----------+---------------------+ 
| 579 | test complete item - delete me            |   1 | 2009-07-28 13:04:38 | 
| 579 | test complete item - delete me            |   0 | 2009-07-28 14:12:12 | 
+--------+-----------------------------------------------------------------------------+-----------+---------------------+ 

todo_itemStatusテーブル内の最新のエントリからstatusKey/statusDateを返すタスクエントリ。

私は私の説明では少し曖昧でしたが、私は非常に長いメッセージを書いたくありませんでした。必要に応じてもっと詳細を提供することができます。

私が間違っていることを誰かに提案できますか?実際のデータベースを作って以来、長い時間がかかりました。私はここで何が間違っているのか分かりません...

多くの感謝! デイブ

答えて

0

は、私はいくつかのより多くの実験きたし、次のクエリは、私が欲しいものを行います。

 
select todo_item.itemId, todo_item.title, todo_itemStatus.statusKey, todo_itemStatus.statusDate from todo_itemStatus, todo_item where todo_item.itemId = todo_itemStatus.itemId and todo_item.projectId = 13 and todo_itemStatus.statusDate = (select MAX(status.statusDate) from todo_itemStatus as status where status.itemId = todo_item.itemId); 

だから私は今、幸せです。すべての助けと提案をありがとう。

デイブ。

1

あなたはDISTINCTキーワード(Microsoft SQL Serverの)

EDITを使用してになります。私はあなたの質問を再読み込みしてきたと私はGROUP BY句は、このような状況では、より適していると思います。あなたは何をする必要があるかしかし、本質的に、http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/をお読みくださいGROUP BY句を使用することに興味を持っている列を最初に選択されています

SELECT todo_itemStatus.itemStatusId, MAX(todo_itemStatus.statusDate) 
FROM todo_item, todo_project, todo_itemStatus 
WHERE todo_item.projectId = todo_project.projectId 
AND todo_itemStatus.itemId = todo_item.itemId 
AND todo_project.projectId = 13 
GROUP BY itemStatusId 

私たちは、その後の残りの部分を取得するには、IDののこのセットに自己結合我々が興味を持っている列:

SELECT 
    todo_item.itemId, 
    todo_item.title, 
    todo_itemStatus.statusKey, 
    todo_itemStatus.statusDate 
FROM todo_item 
JOIN todo_itemStatus 
ON todo_itemStatus.itemId = todo_item.itemId 
JOIN 
    (SELECT todo_itemStatus.itemStatusId, MAX(todo_itemStatus.statusDate) 
    FROM todo_item, todo_project, todo_itemStatus 
    WHERE todo_item.projectId = todo_project.projectId 
    AND todo_itemStatus.itemId = todo_item.itemId 
    AND todo_project.projectId = 13 
    GROUP BY itemStatusId) AS x 
ON todo_itemStatus.itemStatusId = x.itemStatusId 
+0

こんにちは、ありがとう、私はDISTINCTが私が望むことをするとは思わない。問題は、todo_itemごとに複数のtodo_itemStatusエントリがあり、最新のものを取得したいということです。私は間違っている可能性があります...しかし、簡単なテストではエラーが返されました... – DaveS

+0

あなたの質問をもう一度読んでください。私は実際にGROUP BYが必要としていると思います - あなたのために何かを思いついてみてください。 – Justin

+0

ありがとうございました。私はその記事を見て、あなたの投稿を再読し、私がどのように乗っているかを教えてくれるでしょう。ありがとうございました! – DaveS