2013-03-06 2 views
0

On this question Я получил ответ, который сработал хорошо. Теперь мне интересно, есть ли возможная лучшая структура.Должен ли я создать новое поле в таблице или просто выбрать MAX второй таблицы

У меня есть две таблицы.

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

На данный момент, чтобы получить статус моего проекта, я получаю идентификатор проекта и вытащить последнюю строку из таблицы состояния на основе идентификатора проекта. Чтобы получить эту последнюю строку, это довольно хлопот.

Должен ли я изменить схему на это?

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

Тогда я могу только присоединиться к таблицам с FK и получить строку, что я хочу, не смотря на последний?

EDIT:

Так что я хочу что-то вроде этого

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

Но я хочу только последнюю запись в таблице состояния.

EDIT 2:

Так что я хочу что-то вроде этого

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

Но каждый проект вернулся, только получить последнюю запись статуса для этого PROJECT_ID от статуса.

ответ

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

Это будет использовать отдельный запрос. Я хотел бы, чтобы один запрос был соединен для скорости –

+0

Не вычисляет? Оба являются одиночными запросами для разных целей (так что вам нужно только 1 по вашему выбору), и «один запрос соединен для скорости» => Я не понимаю, что вы имеете в виду. – Wrikken

+0

Я хотел бы выбрать проект и получить статус в этом запросе. Разве это не быстрее, чем выполнение двух запросов? –

1

Это один из способов сделать это.

Возможно, вам не понадобится поле current_status для FK; почему бы просто не сохранить стоимость? В противном случае вы могли бы получить нечетные круговые ссылки.

Другой способ - сохранить архив состояния, отдельный из таблицы проектов. Каждый раз, когда статус изменяется, вставьте текущее состояние в таблицу архива и измените значение project.status.

+0

Ваш второй вариант - это то, что я имел в виду –

+1

, с помощью триггера, чтобы заполнить таблицу истории событий. то только иметь дело с основной таблицей в целом. – Randy

+0

Мне нравится триггерный маршрут. – landons

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