За последние 24 часа нас посетил 15741 программист и 1664 робота. Сейчас ищут 818 программистов ...

GROUP BY и сортировка

Тема в разделе "PHP и базы данных", создана пользователем allowance, 23 фев 2011.

  1. allowance

    allowance Активный пользователь

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    Есть такой запрос:
    Код (Text):
    1. mysql_query("SELECT id, FROM `mes` WHERE number='$ID' GROUP BY code ORDER BY viewed,id DESC");
    В таблице содержаться много строк с одинаковым значением code, и их группирую GROUP BY code.
    Как сделать сортировку сначала по viewed(0 либо 1 в таблице), а потом по id DESC(от большого числа к меньшему). Из-за GROUP BY не правильно сортирует.
     
  2. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    а что неправильно сортирует? как должно быть?
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    по одной небось выводит
     
  4. allowance

    allowance Активный пользователь

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    iliavlad

    Из-за GROUP BY не правильно сортирует :)

    id -- code - viewed - number
    1 -- asd --- 1 -------- 2
    2 -- sss --- 1 -------- 1
    3 -- asd --- 1 -------- 2
    4 -- sss --- 1 -------- 1
    5 -- sss --- 1 -------- 1
    6 -- asd --- 0 -------- 2



    Выводит первым группу number 1(5 -- sss --- 1 -------- 1), а должно выводить группу number 2 (6 -- asd --- 0 -------- 2)

    id -- code - viewed - number
    1 -- asd --- 1 -------- 2
    2 -- sss --- 1 -------- 1
    3 -- asd --- 1 -------- 2
    4 -- sss --- 0 -------- 1

    При таком раскладе выведет первым группу number 1 (4 -- sss --- 0 -------- 1) как и должно.
     
  5. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    там же еще фильтруется по number. т.е. или 1, или 2 должно выводиться? и зачем по id сортировать?
     
  6. allowance

    allowance Активный пользователь

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    iliavlad
    Упрощал запрос, сделал ошибку.
    Сортировка по id нужна когда будет много number'ов и много строк, viewed могут быть все со значением 1.
    Код (Text):
    1. mysql_query("SELECT id, FROM `mes` WHERE number in (1,2) GROUP BY code ORDER BY viewed,id DESC");
    id -- code - viewed - number
    1 -- asd --- 1 -------- 2
    2 -- sss --- 1 -------- 1
    3 -- asd --- 1 -------- 2
    4 -- sss --- 1 -------- 1
    5 -- sss --- 1 -------- 1
    6 -- asd --- 0 -------- 2

    Должен вывести первым number 2 а потом number 1 но получается наоборот...
     
  7. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    [sql]SELECT min(id) as id FROM `mes` GROUP BY `code` ORDER BY viewed, id DESC[/sql]
     
  8. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    allowance
    посмотри в мануале, может надо явно указать, что для одного поля сортировка должна быть ASC, а для другого DESC.
     
  9. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Да гребаный карась!
    Когда используется GROUP BY, то мы работаем уже с группами, а не с отдельными записями. При GROUP BY code у групп нету id, у них нету viewed.
    Всем срочно тренироваться в MSSQL!
     
  10. allowance

    allowance Активный пользователь

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    Volt(220)
    Так а как тогда можно решить данную задачку?
     
  11. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    А Вы сначала сформулируйте задачу.
     
  12. allowance

    allowance Активный пользователь

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    Volt(220)
    Так значит. Есть таблица сообщений, нужно вывести сгруппированные сообщения по number отсортировав сначала по viewed(0 либо 1 в таблице), а потом по id DESC(от большого числа к меньшему).

    Т.е. если везде viewed=1 то группа сообщений которая имеет запись с наибольшим id выводится первой.
    Если у какой-то группы viewed = 0, то выводить сначала группу сообщений где есть запись с viewed = 0. Если у многих групп сообщений viewed = 0, то выводить первую ту группу которая имеет запись с наибольшим id.
    Это теория :)
     
  13. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Значит так.
    1)У группы нет viewed. Вы хотите отсортировать группы по убыванию суммы viewed всех записей группы?
    2)У группы нет id. Как по нему сортировать?
     
  14. allowance

    allowance Активный пользователь

    С нами с:
    19 янв 2010
    Сообщения:
    196
    Симпатии:
    0
    Volt(220)
    Ну может есть какая-нибудь альтернатива решения задачи?
    В два запроса, например... Или замены GROUP BY на что-то другое... Цель - отсортировать сгруппированное, не цепляйтесь сразу за возможности GROUP BY.
     
  15. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Начните с
    [sql]SELECT * FROM `mes` WHERE number='$ID' ORDER BY code[/sql]
    Посмотрите что вы в итоге хотите получить.
    Если очень надо, можно будет затем приджойнить нечто вроде:
    [sql](select sum(viewed) as mySum, code from mes group by code) as t on t.code=mes.code[/sql]
    и сортировать по code и по mySum.

    Короче, начните с примера. Возьмите 30 строк разных данных и упорядочите их так как надо. А затем думайте над запросом, который воспроизводит такой порядок.