Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос строк с определённым текущим состоянием из таблицы истории состояний / 12 сообщений из 12, страница 1 из 1
18.07.2005, 15:14:38
    #33171605
Greendrake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
Никак не могу написать запрос.

В таблице истории состояний заказов три поля:

id (это id заказа из другой таблицы - таблицы заказов)
status - принимает значения 1,2,3..
time - UNIX-метка - время, когда данный заказ изменил своё состояние на status

Нужно выбрать id тех заказов, ТЕКУЩЕЕ состояние которых x (только без подзапросов - стоит 4.0.xx).
...
Рейтинг: 0 / 0
18.07.2005, 15:24:42
    #33171632
mahoune
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
Посмотри вот этот топик , там нечто схожее обсуждалось.

Код: plaintext
mahoune
...
Рейтинг: 0 / 0
18.07.2005, 15:28:27
    #33171643
RFT
RFT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
Может просто
Код: plaintext
select id from history_status where status=x

Где history_status - таблица истории состояний, и х - одно из нужных значений 1,2 или 3...
...
Рейтинг: 0 / 0
18.07.2005, 15:33:13
    #33171659
Greendrake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
Да нет, RFT, такой запрос выдаст все те id, статус которых вообще когда-то был x, а мне нужно что бы x был именно ПОСЛЕДНИМ (текущим) статусом этого id.
...
Рейтинг: 0 / 0
18.07.2005, 16:54:39
    #33171928
RFT
RFT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
А состояние по мере изменения всегда последовательно увеличивается? Если так, то ИМХО несколько неверно реализована база... Надо тогда чтобы записи со статусом не добавлялись, а обновлялись. А то что было на ранних этапах - нетрудно было бы понять: если есть 2, то был и 1, если есть три, то были и 1 и 2.
Возможности это поменять уже нет? Если есть, то работка упростится по самый неболуй.
Ну это ИМХО.
...
Рейтинг: 0 / 0
18.07.2005, 17:04:04
    #33171959
Greendrake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
RFT, в том то и фишка, что нужно хранить именно ИСТОРИЮ состояний, а не просто текущее состояние. То есть нужно чтобы всегда можно было посмотреть - ага, вот такой-то заказ изменил своё состояние с 1 на 2 тогда-то, с 2 на 3 - тогда то...
И вовсе не обязательно состояния будут последовательно увеличиваться. Например, возможна такая история: 1->2->3->2 ....

Собственно, выход известен - можно, помимо таблицы истории, хранить текущее состояние в таблице самих заказов. Но это есть дублирование информации: чую, что некое изящное решение всё же есть.
...
Рейтинг: 0 / 0
18.07.2005, 17:17:17
    #33171997
RFT
RFT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
Тогда наверное временные таблицы использовать...
...
Рейтинг: 0 / 0
18.07.2005, 17:20:00
    #33172005
mahoune
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
Изящное решение всегда есть, но оно, как правило, не сопоставимо с быстродействием. Я предложил бы хранить дополнительно текущее состояние в таблице заказов. А при необходимости истории обращаться уже к с другим, более долгим и сложным запросом в базе к таблице с историей изменения статусов...

Вариант "изящного решения" обсуждался здесь на форуме, пока я его найти не могу, но поверь при всем своем изяществе он не будет работать шустро!

Код: plaintext
mahoune
...
Рейтинг: 0 / 0
19.07.2005, 12:36:40
    #33173175
ap99ap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
обычный select к этой таблице.
группируешь по id заказа, по timestamp берешь max(), на status накладываешь условие having.

Но выше тебе правильно сказали - неправильно спроектирована база.
Я бы добавил в таблицу заказа еще одно поле - обратную ссылку на актуальную строку состояния заказа. Дальнейшее построение запросов очевидно, не так ли?
...
Рейтинг: 0 / 0
21.07.2005, 09:35:05
    #33177211
Greendrake
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
ap99apЯ бы добавил в таблицу заказа еще одно поле - обратную ссылку на актуальную строку состояния заказа. Дальнейшее построение запросов очевидно, не так ли?Да, я так сейчас и делаю.

И всё же,
ap99apобычный select к этой таблице.
группируешь по id заказа, по timestamp берешь max(), на status накладываешь условие having.я с этим как раз поначалу и мучался, он мне выдавал по времени MAX, но в таблице результата статус не соответствовал этому времени в исходной таблице истории. Может, напишешь запрос на языке SQL, а не на русском? :-) Очень охота протестировать быстродействие. Спасибо.
...
Рейтинг: 0 / 0
21.07.2005, 13:05:34
    #33177822
ap99ap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
Greendrake ap99apобычный select к этой таблице.
группируешь по id заказа, по timestamp берешь max(), на status накладываешь условие having.я с этим как раз поначалу и мучался, он мне выдавал по времени MAX, но в таблице результата статус не соответствовал этому времени в исходной таблице истории. Может, напишешь запрос на языке SQL, а не на русском? :-) Очень охота протестировать быстродействие. Спасибо.

select id, right(max(concat(t,status)),1) from tbl group by id having status = 2;

этот фокус не будет особо быстрым, но что ж ты хочешь в такой ситуации..
...
Рейтинг: 0 / 0
21.07.2005, 13:08:08
    #33177831
ap99ap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос строк с определённым текущим состоянием из таблицы истории состояний
ap99ap
select id, right(max(concat(t,status)),1) from tbl group by id having status = 2;


ну, в смысле, там надо будет вычисляемое поле назвать как-нибудь типа 's' и в having проверять 's = 2', конечно. Главное, идею ты понял.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос строк с определённым текущим состоянием из таблицы истории состояний / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]