Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: В чем может быть ошибка
 
 автор: Besenok   (20.06.2010 в 21:58)   письмо автору
 
 

Доброго времени суток!

Задача заключается в следующем

есть таблица
View
необходимо вывести последних 10 записей отсортировав их по времени добавления с уникальными idSites

запрос выглядит так


SELECT `idSites` FROM `View` GROUP BY `idSites` ORDER BY `timeView` DESC LIMIT 10


результат запроса: выводит idSites по убыванию, а требовалось вывести idSites по времени просмотра в убывании

  Ответить  
 
 автор: sms-send   (20.06.2010 в 23:42)   письмо автору
 
   для: Besenok   (20.06.2010 в 21:58)
 

После группировки сортировать можно только по группируемым полям (можно = имеет смысл). По полю `timeView` группировки не было, значит и сортировка ничего хорошего не даст (большинство СУБД не допускают таких абсурдных запросов).


Насчёт уникальности, пример:
idSites | timeView
1 | 23:15:02
3 | 23:15:13
4 | 23:15:19
2 | 23:15:38
3 | 23:15:55

Какой должен быть порядок? 1, 3, 4, 2 или 1, 4, 2, 3?

"время добавления", "время просмотра" и `timeView` - это одно и тоже?

  Ответить  
 
 автор: Besenok   (21.06.2010 в 00:33)   письмо автору
 
   для: sms-send   (20.06.2010 в 23:42)
 

Порядок должен быть 3, 2, 4, 1

  Ответить  
 
 автор: sms-send   (21.06.2010 в 00:43)   письмо автору
 
   для: Besenok   (21.06.2010 в 00:33)
 

То есть для дублирующегося `idSites` для сортировки выбирать наиболее позднее значение `timeView`?

SELECT `idSites`, MAX(`timeView`) AS `lastTimeView`
FROM `View`
GROUP BY `idSites`
ORDER BY `lastTimeView` DESC
LIMIT 10

  Ответить  
 
 автор: Trianon   (21.06.2010 в 10:49)   письмо автору
 
   для: sms-send   (20.06.2010 в 23:42)
 

>После группировки сортировать можно только по группируемым полям (можно = имеет смысл).
Не имеет смысл, а именно можно.
Правда, можно еще по результатам агрегатных функций над оставшимися полями.

  Ответить  
 
 автор: sms-send   (21.06.2010 в 18:14)   письмо автору
 
   для: Trianon   (21.06.2010 в 10:49)
 

> Не имеет смысл, а именно можно.
Но ведь MySQL допускает запросы с группировкой по одним полям и выборкой/сортировкой по другим, без их агрегирования. А смысл может появиться, например, в таком запросе:

SELECT `u`.`id`, `u`.`login`, COUNT(`messages`.*) AS `count`
FROM `users` AS `u` LEFT OUTER JOIN `messages` AS `m` ON `u`.`id`=`m`.`user`
GROUP BY `u`.`id`
ORDER BY `u`.`login`


Где `users`.`id` - первичный ключ, `users`.`login` - поле с уникальным ключём. То есть при группировке по `users`.`id` в каждый ряд конкретной группы попадут заведомо одинаковые `users`.`login`

Можно, конечно, добавить группировку по полю `login`, что будет и по смыслу и по факту пустой операцией.

  Ответить  
 
 автор: Trianon   (21.06.2010 в 21:18)   письмо автору
 
   для: sms-send   (21.06.2010 в 18:14)
 

Мало мальски приличный SQL-сервер такой запрос отвергнет, как ошибочный.
Так что и за ради переносимости, и за ради хорошего тона, я бы такие запросы допустимыми не расценивал.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования