в виде таблицы
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?
Или удалить все кроме статуса с максимальным числом?
Или что то я не врубился. Нужно вывести дома с максимальным числом 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, а там домов куча и для каждого надо найти актуальный статус.
Предложение которое дал 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:
вот так будет))
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`
_____________