[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: SQL запрос
freelancer89
Доброго времени суток. Тут встала такая задача, существует MySQL БД с ьаблицей статусов домов.

в виде таблицы
id - первичный ключ
id_dom - идентификатор дома
id_status - идинтификатор статуса

Статусы домов могут меняться, и в таблицу прсото заносится новый кортеж с id дома и id статуса. Актруальным считается последний статус.

Я вот никак не могу ранять как написать запрос для того, что бы выбока из таблицы была "актуальной".

например:

id | id_dom |id_status
---------------------------
31 | 1024 | 1
32 | 1024 | 2
33 | 1024 | 3

Актуальным статусом дома является последняя строка.
Домов в таьлице много и для каждого дома нужно определить актуальный статус.

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




Спустя 8 минут, 43 секунды (28.06.2012 - 17:34) Arh написал(а):
А почему нельзя менять статус в таблице, вместо того чтобы забивать новые данные с новым статусом?
Или что то я не врубился. Нужно вывести дома с максимальным числом id_status?
Или удалить все кроме статуса с максимальным числом?

Спустя 58 секунд (28.06.2012 - 17:35) rooor написал(а):
... WHERE `id_dom` = 1024 ORDER BY `id_status` DESC LIMIT 1

Спустя 3 минуты, 1 секунда (28.06.2012 - 17:38) Guest написал(а):
Тех задание такое. Нельзя использовать update, так как нужно отслеживать изменения статусов в бушующем.
Предложение которое дал rooor хорошее, но только для дома с ид 1024, а там домов куча и для каждого надо найти актуальный статус.

Спустя 3 минуты, 17 секунд (28.06.2012 - 17:41) rooor написал(а):
SELECT ... FROM ... GROUP BY `id_dom` ORDER BY `id_status` DESC

?

Спустя 3 минуты, 15 секунд (28.06.2012 - 17:45) rooor написал(а):
не, не будет работать
upd:
вот так будет))
SELECT `id` FROM `table` WHERE `id_status` = (SELECT MAX(`id_status`) FROM `table`) GROUP BY `id_dom`

Спустя 8 минут, 29 секунд (28.06.2012 - 17:53) Arh написал(а):
А так проще вроде)
SELECT  DISTINCT  `id` FROM `table` ORDER BY `id_status` DESC


Спустя 3 минуты (28.06.2012 - 17:56) rooor написал(а):
Arh
и выводит всё подряд)

Спустя 2 минуты, 11 секунд (28.06.2012 - 17:58) Arh написал(а):
Цитата (rooor @ 28.06.2012 - 14:56)
Arh
и выводит всё подряд)

Ну, выводит все дома с максимальным статусом не? =)

Спустя 1 минута, 1 секунда (28.06.2012 - 17:59) rooor написал(а):
ну дык пусть ТС скажет что выводит

Спустя 2 минуты, 26 секунд (28.06.2012 - 18:02) Arh написал(а):
Наверно так)
SELECT  DISTINCT  `id_dom`FROM `table` ORDER BY `id_status` DESC

Спустя 1 час, 3 минуты, 3 секунды (28.06.2012 - 19:05) vital написал(а):
Цитата
изменения статусов в бушующем.

Для этого делается другая таблица, в к-й хранится история, и заполняется она триггером на апдейт.

Спустя 2 минуты, 17 секунд (28.06.2012 - 19:07) vital написал(а):
А хранение старых данных в основной таблице лишь добавляет гемор, например как выше, и увеличивает время выборки из-за туевой кучи не нужных данных.

Спустя 3 часа, 45 минут, 4 секунды (28.06.2012 - 22:52) ИНСИ написал(а):
freelancer89 как вариант:
SELECT *
FROM (SELECT * FROM `table` ORDER BY `id` DESC) AS `tab`
GROUP BY `id_dom`


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.