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

Форум MySQL

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

 

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

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

тема: Сортировка по двум полям
 
 автор: kest131   (10.05.2006 в 17:38)   письмо автору
 
 

Можно писать так:


select * from table group by name order by size desc;


где size - число

Но это не дает нужное :(

Как правильно сформировать запрос что-бы вывелось аналогичное?


select * from table order by size desc group by name ;

   
 
 автор: XPraptor   (10.05.2006 в 17:46)   письмо автору
 
   для: kest131   (10.05.2006 в 17:38)
 

GROUP BY не может применяться при выборе всех полей (*).
Ты сам подумай - ты группируешь по какому то полю, а остальные поля у которых поле группировки схожее имеют одно и то же значение? Не всегда! Поэтому к ним необходимо применить функции агрегатные, просуммировать, или выбрать макс мин или еще че нить.

   
 
 автор: kest131   (10.05.2006 в 18:01)   письмо автору
 
   для: XPraptor   (10.05.2006 в 17:46)
 

Просто надо сначала сгрупировать по какому-то значению а ужу ( да уже!) потом применить GROUP by к другому параметру .Неужели не понятно

Может можно обьеденить два запроса

   
 
 автор: XPraptor   (10.05.2006 в 18:04)   письмо автору
 
   для: kest131   (10.05.2006 в 18:01)
 

Тебе еще раз говорят - ты должен выбрать в select определенные поля, или функции определенных полей. А MySQL поддерживает двойную группировку GROUP BY (fild1, fild2)

   
 
 автор: Trianon   (10.05.2006 в 18:05)   письмо автору
 
   для: kest131   (10.05.2006 в 18:01)
 

GROUP by здесь ни при чем. То что Вы хотите, называется сортировкой по нескольким полям.
Либо
select * from table order  by size desc, name asc;  

либо
select * from table order  by name asc, size desc;  

в зависимосто от того, что именно Вам нужно.

   
 
 автор: kest131   (10.05.2006 в 18:28)   письмо автору
 
   для: Trianon   (10.05.2006 в 18:05)
 

>либо
>
select * from table order  by name asc, size desc; 
>


Почти это но значения name должны быть уникальны как при group by

   
 
 автор: Trianon   (10.05.2006 в 18:34)   письмо автору
 
   для: kest131   (10.05.2006 в 18:28)
 

Если в базе name уникальны - результат таким и будет.
Если name повторяются - Вам нужно определиться, какие именно строки Вы хотите получить. С помощью агрегатных функций (min, max, sum, avg, group_concat и т.п.) в разделе select. И тогда уже можно писать group by.

   
 
 автор: kest131   (10.05.2006 в 18:41)   письмо автору
 
   для: Trianon   (10.05.2006 в 18:34)
 

Обьесняю план:

Есть таблицы в ней есть фотки у каждой фотки есть ее тема(name) и есть size(количество скачек этой фотки)

Нужно сначала отсортировать фотки по size desc а потом так как поле name повторяеться отсортировать по name(что-бы name стал уникальным)

В двух словах:

Надо вывести по одной самой скачиваемой фотки из одной темы

   
 
 автор: cheops   (10.05.2006 в 19:32)   письмо автору
 
   для: kest131   (10.05.2006 в 18:41)
 

Для этого необходимо пречислить поля после конструкции ORDER BY через запятую
select * from table group by name order by size desc, name

   
 
 автор: kest131   (10.05.2006 в 21:11)   письмо автору
 
   для: cheops   (10.05.2006 в 19:32)
 

НЕ то!

Это сначала сортирует по GROUP (берет самые первые попавшиеся значения) а потом только по size .

Надо с точностью да наоборот

   
 
 автор: cheops   (10.05.2006 в 21:39)   письмо автору
 
   для: kest131   (10.05.2006 в 21:11)
 

Можно исключить GROUP BY, а затем выловить нужный результат в результирующей таблице при помощи PHP
select * from table name order by size desc, name

   
 
 автор: kest131   (11.05.2006 в 17:50)   письмо автору
 
   для: cheops   (10.05.2006 в 21:39)
 

Это работает при мелких таблицах.

А если в таблице 10000 то это вызовет не малую нагрузку
А хостинг ограничивает память на 16MB

   
 
 автор: cheops   (11.05.2006 в 22:10)   письмо автору
 
   для: kest131   (11.05.2006 в 17:50)
 

Память отводимая под PHP-скрипт не влият на память отводимую MySQL сервером под буферы и кэши запросов.

   
 
 автор: kest131   (10.05.2006 в 18:49)   письмо автору
 
   для: Trianon   (10.05.2006 в 18:34)
 

Не знаете?

И я не наю

   
 
 автор: Trianon   (10.05.2006 в 19:46)   письмо автору
 
   для: kest131   (10.05.2006 в 18:49)
 

Вы меня что - на "слабо" взять решили? :))

SELECT distinct id_photo, id_theme FROM 
    (select max (downl_count) as mcnt, id_theme as mid from tab group by id_theme) as t1 
  JOIN 
    (select downl_count, id_photo, id_theme from tab ) as t2 
  ON mid = id_theme AND mcnt = downl_count

   
 
 автор: kest131   (10.05.2006 в 21:20)   письмо автору
 
   для: Trianon   (10.05.2006 в 19:46)
 

Что за баракуда?!

Вы забываете что данных всего два а не 4 как у вас(name,size).

Придеться вернуться к старому варианту :

Просто сделать еще один запрос в цикле : )


Спасибо за проявленный труд.

   
 
 автор: XPraptor   (11.05.2006 в 11:42)   письмо автору
 
   для: kest131   (10.05.2006 в 21:20)
 

Твоя задача это: SELECT MAX(size) FROM TableName GROUP BY (name)

[поправлено модератором]

   
 
 автор: Trianon   (11.05.2006 в 12:10)   письмо автору
 
   для: XPraptor   (11.05.2006 в 11:42)
 

Этого мало. Это выдаст значение критерия, но никак не ключ к записи, которая удовлетворяет этому критерию. Придется строить большой запрос.

   
 
 автор: kest131   (11.05.2006 в 17:55)   письмо автору
 
   для: Trianon   (11.05.2006 в 12:10)
 

>Этого мало. Это выдаст значение критерия, но никак не ключ к
>записи, которая удовлетворяет этому критерию.

Ключ - это что(id?)

>Придется строить большой запрос.

Почему большой?

Все решение найдено.Темка закрыта.А с пивом завязывай!

   
 
 автор: kest131   (11.05.2006 в 17:52)   письмо автору
 
   для: XPraptor   (11.05.2006 в 11:42)
 

Первое правильное решение!
5 баллов

   
 
 автор: Trianon   (11.05.2006 в 12:31)   письмо автору
 
   для: kest131   (10.05.2006 в 21:20)
 

Вот самая понятная из Ваших формулировок:

В двух словах:
Надо вывести по одной самой скачиваемой фотки из одной темы


Отсюда следует, что одной теме может соответствовать несколько фотографий, которые могут отличаться разным числом закачек.

Я могу допустить, что name обозначает тему. В конце концов почему у темы не может быть имени?
Я даже готов допустить, что size обозначает число закачек, хотя это уже форменное издевательство: size значит размер, но никак не счетчик.
Но даже в этом случае остается неясным как в пределах одной темы одна фотография в Ваших обозначениях отличается от другой?

В моих: id_theme обозначает тему, id_photo обозначает фотографию, downl_count обозначает счетчик закачек. Четвертой сущности я не вводил, а три - минимум. Двумя (для решения сформулированной в цитате проблемы) не обойтись.

А формулировать проблему можно было бы и почётче...

   
 
 автор: kest131   (11.05.2006 в 17:46)   письмо автору
 
   для: Trianon   (11.05.2006 в 12:31)
 

>Отсюда следует, что одной теме может соответствовать
>несколько фотографий, которые могут отличаться разным числом
>закачек.
>
>Я могу допустить, что name обозначает тему. В конце концов
>почему у темы не может быть имени?

Все верно.

>Я даже готов допустить, что size обозначает число закачек,
>хотя это уже форменное издевательство: size значит размер,
>но никак не счетчик.

Я знаю что означает size просто для для примера это первое что пришло в голову.

>Но даже в этом случае остается неясным как в пределах одной
>темы одна фотография в Ваших обозначениях отличается от
>другой?

По id - это и так ясно

>
>В моих: id_theme обозначает тему, id_photo обозначает
>фотографию, downl_count обозначает счетчик закачек.
>Четвертой сущности я не вводил, а три - минимум. Двумя (для
>решения сформулированной в цитате проблемы) не обойтись.

Для всей задочи - мне вообще надо значений 8 но их же просто подставить для задачи которую я просил достаточно и двух значений (сортировка то идет по двум полям)

>А формулировать проблему можно было бы и почётче...

Возможно

   
Rambler's Top100
вверх

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