Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MySQL, запрос (последняя дата, цена) 
:(
    Опции темы
Ripper
Дата 17.1.2012, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Здравствуйте.
Есть табличка screens - сущность экран. У него есть id и name. И screens_with_price - сущность "экран с ценой". У неё есть id, screen_id, date, price. Т.е. в ней хранится история цен на экран. 
Мне нужно вытащить все экраны, и их последние цены (т.е. цена на последний момент), если цены нет то указать null или -1, не важно.

Мне удалось только вытащить цены, если они есть:
Код

SELECT screens.id, screens.name, price
FROM screens
JOIN screens_with_prices ON screens_with_prices.screen_id = screens.id
JOIN (SELECT screen_id, max(date) as last_date from screens_with_prices group by screen_id) as t2
ON screens_with_prices.date = t2.last_date


Но никак не получается сделать так чтобы вошли записи для экранов, у которых нет цен :(



--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
AndreyIQ
Дата 17.1.2012, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 3
Всего: 8



Код

SELECT screens.id, screens.name, price
FROM screens
LEFT JOIN screens_with_prices ON screens_with_prices.screen_id = screens.id
LEFT JOIN (SELECT screen_id, max(date) as last_date from screens_with_prices group by screen_id) as t2
ON screens_with_prices.date = t2.last_date

PM MAIL   Вверх
Ripper
Дата 17.1.2012, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



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


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Zloxa
Дата 17.1.2012, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Код

SELECT screens.id, screens.name, screens_with_prices.price
FROM (SELECT screen_id, max(date) as last_date from screens_with_prices group by screen_id) as t2
JOIN  screens on screens.id = t2.screen_id
JOIN screens_with_prices ON screens_with_prices.screen_id = t2.screen_id and t2.last_date = screens_with_prices.date


Это сообщение отредактировал(а) Zloxa - 17.1.2012, 13:41


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ripper
Дата 17.1.2012, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Lonely soul...
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 30.6.2004
Где: г. Москва

Репутация: нет
Всего: 23



Честно говоря не очень запрос понял, но он так же не возвращает null-ов(


--------------------
"Он знает: надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума" - Над кукушкиным гнездом
PM MAIL ICQ   Вверх
Zloxa
Дата 17.1.2012, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Код

SELECT screens.id, screens.name, screens_with_prices.price
FROM screens  
left JOIN  (SELECT screen_id, max(date) as last_date from screens_with_prices group by screen_id) as t2 on screens.id = t2.screen_id
left JOIN screens_with_prices ON screens_with_prices.screen_id = t2.screen_id and t2.last_date = screens_with_prices.date


Добавлено @ 14:13
Цитата(Ripper @  17.1.2012,  14:02 Найти цитируемый пост)
Честно говоря не очень запрос понял

Вы не правильно указали критерии объединения для исходного запроса. Он в принципе не мог вам возвращать желаемого. Я подумал было, что дело лишь в этом. О том, что вам еще и неопределенные значения выводить - просто не дочитал.

Это сообщение отредактировал(а) Zloxa - 17.1.2012, 15:22


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 17.1.2012, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Попробуйте еще такой вариант:
Код

SELECT screens.id, screens.name
  , (select price from screens_with_prices where screens_with_prices.screen_id = screens.id order by date desc limit 1) price
FROM screens


Он может дать вам исключительное преимущество на больших объемах screens_with_prices, при наличии индекса по паре screens_with_prices(screen_id,date), однако в случае, если эта пара окажется не уникальной, будет возвращена любая(бох весть какая) цена для максимальной даты. Ранее предложенный запрос, в этом случае вернет все значения цены, для максимальной даты.

Правда, думаю, стоит оговориться, что я не испытываю особой уверенности в том, что MySQL способен начать просмотр индекса с наибольшей позиции и прерваться при нахождении первой же записи. Здесь пусть меня поправят гуру MySQL, если он так не умеет. Если мои сомнения не беспочвенны, и MySQL вернет значение только после просмотра всего диапазона значений, суть затеи невилируется чуть ли не полностью. В этом случае выход может быть найден путем сохранення некой обратной величины даты, ее индексации и отбора по ней c cортировкой по asc.

Ну и довеском - ссыль в тему http://www.sql.ru/forum/actualthread.aspx?tid=687908

Это сообщение отредактировал(а) Zloxa - 17.1.2012, 15:52


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.