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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выбор коментариев, не могу правильно составить запрос 
:(
    Опции темы
baryshkov
Дата 31.10.2012, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Здравствуйте, есть две таблицы:
Таблица 1. Объект:
-id
-имя
Таблица 2. Отзывы к объектам:
-id объекта
-дата создания отзыва
-отзыв

Хочу по каждому объекту получить только самый ПОСЛЕДНИЙ отзыв.
Делал так:
Код

SELECT  objects.*, MAX(c.date_create) AS dc FROM responses c 
                            LEFT OUTER JOIN objects ON c.object_id=objects.id

                            GROUP BY object_id
                            
                            order BY dc DESC
                            LIMIT 7

т.е. хочу получить список 7 объектов у кого есть самые последнии отзывы. Но при этом объекты не должны повторяться!

Это сообщение отредактировал(а) baryshkov - 31.10.2012, 10:04
PM MAIL   Вверх
Zloxa
Дата 31.10.2012, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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





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


Новичок



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

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



Цитата(Zloxa @ 31.10.2012,  10:35)
http://www.sql.ru/forum/actualthread.aspx?tid=687908

Подход к дате через MAX верный?
Код

SELECT *
                            FROM (
SELECT id, MAX(date_create) AS dc FROM responses  
GROUP BY object_id
ORDER BY dc DESC
LIMIT 10
 ) a
INNER JOIN responses c ON (a.id=c.id  )

Все равно не корректно работает, объекты выбрались правильно, а вот даты получились самы рании, вернее тексты отзывов

Это сообщение отредактировал(а) baryshkov - 31.10.2012, 10:56
PM MAIL   Вверх
Zloxa
Дата 31.10.2012, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Вы читали что написано по ссылке?

Добавлено через 37 секунд
Какой смысл вам отвечать, если вы все равно не читаете? smile


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


Новичок



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

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



Цитата(Zloxa @ 31.10.2012,  11:10)
Вы читали что написано по ссылке?

Добавлено @ 11:11
Какой смысл вам отвечать, если вы все равно не читаете? smile

Все отрабатывает, но не те даты отзывов ((((
PM MAIL   Вверх
Akina
Дата 31.10.2012, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 106
Всего: 454



Цитата(baryshkov @  31.10.2012,  11:52 Найти цитируемый пост)
Подход к дате через MAX верный?

Подход через MAX верный. Его реализация - неверна.
Цитата(baryshkov @  31.10.2012,  13:18 Найти цитируемый пост)
Все отрабатывает, но не те даты отзывов (((( 

Предполагается, что текст будет не только прочитан, но и понят. Второго явно не наблюдается.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 31.10.2012, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Цитата(baryshkov @  31.10.2012,  13:18 Найти цитируемый пост)
не те даты

Дата прадставлена каким типом? Не строкой ли?
Цитата(baryshkov @  31.10.2012,  11:52 Найти цитируемый пост)
о не корректно работает, объекты выбрались правильно, а вот даты получились самы рании, вернее тексты отзывов

Так что всетки получилось "самы раннии" - даты или тексты отзывов? 


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


Новичок



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

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



Цитата(Zloxa @ 31.10.2012,  14:06)
Цитата(baryshkov @  31.10.2012,  13:18 Найти цитируемый пост)
не те даты

Дата прадставлена каким типом? Не строкой ли?
Цитата(baryshkov @  31.10.2012,  11:52 Найти цитируемый пост)
о не корректно работает, объекты выбрались правильно, а вот даты получились самы рании, вернее тексты отзывов

Так что всетки получилось "самы раннии" - даты или тексты отзывов?

формат даты datatime. Объекты выбрались те, а вот отзывы самые раннии!
PM MAIL   Вверх
Akina
Дата 1.11.2012, 07:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 106
Всего: 454



Цитата(baryshkov @  1.11.2012,  08:35 Найти цитируемый пост)
Объекты выбрались те, а вот отзывы самые раннии! 

Посмотрите на свой подзапрос:
Код

SELECT id, MAX(date_create) AS dc FROM responses  
GROUP BY object_id

В dc попадёт максимальное время для каждого object_id - это бесспорно. А вот в id попадёт совершенно случайное значение из имеющихся для группы с одинаковым object_id, а вовсе не от той записи, для которой выбрано значение в dc. Это явно описано в документации, которую, конечно, никто не читает...
Стоит ли удивляться, что в итоге получается хрень?



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
baryshkov
Дата 1.11.2012, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Akina @ 1.11.2012,  07:45)
Цитата(baryshkov @  1.11.2012,  08:35 Найти цитируемый пост)
Объекты выбрались те, а вот отзывы самые раннии! 

Посмотрите на свой подзапрос:
Код

SELECT id, MAX(date_create) AS dc FROM responses  
GROUP BY object_id

В dc попадёт максимальное время для каждого object_id - это бесспорно. А вот в id попадёт совершенно случайное значение из имеющихся для группы с одинаковым object_id, а вовсе не от той записи, для которой выбрано значение в dc. Это явно описано в документации, которую, конечно, никто не читает...
Стоит ли удивляться, что в итоге получается хрень?

А со вторым запросом связывать по dc нельзя, т.к. может оказаться что дата-время одинаковы, верно?
Код

SELECT *
                            FROM (
SELECT MAX(date_create) AS dc FROM responses  
GROUP BY object_id
ORDER BY dc DESC
LIMIT 10
 ) a
INNER JOIN responses c ON (c.date_create=a.dc  )
ORDER BY c.date_create DESC


Это сообщение отредактировал(а) baryshkov - 1.11.2012, 08:10
PM MAIL   Вверх
Akina
Дата 1.11.2012, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 106
Всего: 454



Цитата(baryshkov @  1.11.2012,  09:03 Найти цитируемый пост)
А со вторым запросом связывать по dc нельзя

Можно. И нужно. А вот по id - нельзя.

Цитата(baryshkov @  1.11.2012,  09:03 Найти цитируемый пост)
может оказаться что дата-время одинаковы, верно? 

Да хоть два раза...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
baryshkov
Дата 1.11.2012, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Akina @ 1.11.2012,  08:10)
Цитата(baryshkov @  1.11.2012,  09:03 Найти цитируемый пост)
А со вторым запросом связывать по dc нельзя

Можно. И нужно. А вот по id - нельзя.

Цитата(baryshkov @  1.11.2012,  09:03 Найти цитируемый пост)
может оказаться что дата-время одинаковы, верно? 

Да хоть два раза...

тема закрыта, решение в посте выше. спасибо!
PM MAIL   Вверх
Akina
Дата 1.11.2012, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 106
Всего: 454



Цитата(baryshkov @  1.11.2012,  09:31 Найти цитируемый пост)
решение в посте выше

Решение - ошибочное. Есть наборы данных, на которых будет получен неверный результат - если для разных object_id имеются совпадающие date_create, и хотя бы один из них является максимальным.
Почти правильное решение:

Код

SELECT с.*
FROM 
(
  SELECT object_id, MAX(date_create) AS dc 
  FROM responses  
  GROUP BY object_id
  ORDER BY dc DESC
  LIMIT 10
 ) a
INNER JOIN responses c 
ON c.date_create=a.dc AND c.object_id = a.object_id
ORDER BY c.date_create DESC

Но даже оно даст неверный результат, если пара значений (object_id, date_create) не уникальна.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




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


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

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