2009-07-29 2 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     |    | 
+--------------+-----------------------+------+-----+---------------------+----------------+ 

Эта таблица отслеживает, когда задача будет завершена, а также сохраняет статус всех изменений задач.

Существует таблица проекта и таблица «элемент» (или задачи).

Я в основном хочу, чтобы иметь возможность извлекать список проектов, с подробной информацией о проценте задач. Тем не менее, на данный момент я был бы счастлив, если бы мог просто перечислить каждую задачу в проекте с подробными сведениями о том, завершены ли они.

Насколько я знаю, лучший способ получить самый последний статус задачи - выбрать todo_itemStatus, где statusDate является самым новым, или itemStatusId является самым большим, в то время как itemId равно задаче, которую я интересно.

Я попробовал запрос, как это:

<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 | 
+--------+-----------------------------------------------------------------------------+-----------+---------------------+ 

Который не то, что я хочу, как я хочу только одну возвращаемый функцией statusKey/statusDate из последней записи в таблице todo_itemStatus.

Я знаю, что в своем описании я был немного расплывчатым, но я не хотел писать массово длинное сообщение. При необходимости я могу предоставить гораздо больше деталей.

Пожалуйста, кто-нибудь может предложить, что я делаю неправильно? Прошло много времени с тех пор, как я сделал какие-то реальные материалы базы данных, поэтому я немного не уверен, что я делаю неправильно здесь ...

Большое спасибо! Dave

ответ

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); 

Так теперь я счастлив. Спасибо за всю помощь и предложения.

Dave.

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 

Мы тогда автообъединение к этому набору идентификаторов, чтобы получить остальную часть столбцы, мы заинтересованы в:

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_itemStatus для каждого файла todo_item, и я просто хочу получить самое последнее. Я мог ошибаться, хотя ...но быстрый тест только что дал ошибку ... – DaveS

+0

Да, просто перечитайте свой вопрос, и я думаю, что на самом деле GROUP BY - это то, что нужно - пытаясь придумать что-то для вас. – Justin

+0

Спасибо за это. Я посмотрю на эту статью, а затем перечитаю ваше сообщение и дам вам знать, как я нахожусь. Спасибо! – DaveS

Смежные вопросы