Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: запрос с GROUP и ORDER
Покинул форум
Сообщений всего: 913
Дата рег-ции: Янв. 2008
Помог: 6 раз(а)
Приветствую.
Вот не могу побороть запрос
id | pid | sid | date
1 20 2 2010-05-01
2 20 1 2010-05-02
3 52 2 2010-05-03
4 20 2 2010-05-04
5 20 1 2010-05-01
необходимо получить записи с последней датой и уникальным sid т.е.
2 20 1 2010-05-02
4 20 2 2010-05-04
такой вот запрос возвращает с ранней датой а не последней.
где я не так что делаю?
спасибо.
EuGen
Отправлено: 06 Мая, 2010 - 12:28:53
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Группировка здесь - не правильное решение. Дело в том, что если ее применять вот так (без явной агрегации - такое только в MySQL можно), то какие именно попадут записи в выборку - предсказать невозможно. Поэтому туда могут попасть записи с какой попало датой - после чего СУБД их сортирует, то есть могут попасться вообще записи "из середины". Таким образом после подобной группировки сортировать вообще не имеет смысла.
Да, кстати, не совсем однозначна формулировка "получить записи с последней датой и уникальным sid" - ведь если sid уникален, то он присутствует 1 раз в таблице, то есть он будет первым и единственным для любой даты. (То, что Вы хотите получить, ясно только из приведенного примера).
Как вариант решения:
SELECT MAX(`date`), sid FROM `a` GROUP BY `sid`
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
RomAndry
Отправлено: 06 Мая, 2010 - 12:34:53
Частый посетитель
Покинул форум
Сообщений всего: 913
Дата рег-ции: Янв. 2008
Помог: 6 раз(а)
ясно, спасибо. у меня всегда с GROUP пробелы были
уникальность sid нужна что бы выбрать по одной записи
EuGen
Отправлено: 06 Мая, 2010 - 12:36:21
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Вариант решения с MAX попробуйте - я думаю, Вы это имели ввиду.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
RomAndry
Отправлено: 06 Мая, 2010 - 12:49:12
Частый посетитель
Покинул форум
Сообщений всего: 913
Дата рег-ции: Янв. 2008
Помог: 6 раз(а)
SELECT MAX(`date`), sid FROM `a` GROUP BY `sid`
интересно показывает
id | pid | sid | date
1 20 2 2010-05-01
2 20 1 2010-05-02
4 20 2 2010-05-04
5 20 1 2010-05-01
необходимо получить записи с последней датой и уникальным sid т.е.
2 20 1 2010-05-02
4 20 2 2010-05-04
а выдает
5 20 1 2010-05-02
1 20 2 2010-05-04
т.е. дату правильно выводит но не тот id берет
EuGen
Отправлено: 06 Мая, 2010 - 12:50:26
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Ну так остался 1 шаг - добавить в WHERE нужный pid, я думаю
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
RomAndry
Отправлено: 06 Мая, 2010 - 12:54:27
Частый посетитель
Покинул форум
Сообщений всего: 913
Дата рег-ции: Янв. 2008
Помог: 6 раз(а)
да это есть. просто странный результат
дата с одной строки данных, id с другой
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.