За последние 24 часа нас посетили 18667 программистов и 1828 роботов. Сейчас ищет 1161 программист ...

Сортировка таблицы

Тема в разделе "MySQL", создана пользователем gkhelloworld, 25 дек 2009.

  1. gkhelloworld

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

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    Есть 2 таблицы
    1.
    [sql]mytable1
    ________
    id | name
    ------------
    1 | text1
    ------------
    2 | text2
    ------------
    3 | text3
    ------------[/sql]

    2.
    [sql]mytable2
    ________
    id | voice
    -----------
    1 | 1
    ------
    3 | 2
    ------
    2 | 1
    ------
    1 | 5
    ------
    3 | 1
    --------[/sql]

    Как сделать сортировку из ходя из суммы второй таблицы, например если mytable1.id=1: mytable2.voice = 6,значит id1 на первом месте, id3 = 3 на втором и id2 = 1 на последнем
     
  2. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    [sql]SELECT mytable1.* FROM mytable1, mytable2 WHERE mytable1.id = mytable2.id GROUP BY mytable1.id ORDER BY SUM(voice) DESC[/sql]
     
  3. gkhelloworld

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

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    ну а если для полного идеала, так получилось, чтобы полученный результат составляет из того что есть в mytable2,
    т.е. в mytable2 например только 3 id, а в mytable1 10 id, нужно чтобы остальные тоже были получены

    пример:

    [sql]mytable1
    ________
    id | name
    ------------
    1 | text1
    ------------
    2 | text2
    ------------
    3 | text3
    ------------
    4 | text4
    ------------
    6 | text5
    ------------
    5 | text6[/sql]

    2.
    [sql]mytable2
    ________
    id | voice
    -----------
    1 | 1
    ------
    3 | 2
    ------
    2 | 1
    ------
    1 | 5
    ------
    3 | 1
    --------[/sql]

    результат, типа такого:
    [sql]id text voice
    1 | text1 | 6
    3 | text3 | 3
    2 | text4 | 2
    4 | text4 | 0
    5 | text4 | 0
    6 | text4 | 0[/sql]
     
  4. Volt(220)

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

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Ti
    Есть подозрение что запрос не пройдет... Или вернет некорректные результаты, т.к. не все столбцы, которые надо показать находятся в операторе group by. Ну и не люблю я cross join. =))

    Тупо сортировка:
    [sql]SELECT id
    FROM mytable2 as m2
    GROUP BY id
    ORDER BY SUM(voice) DESC[/sql]

    Вывод всех данных из первой таблицы, для которых есть записи во второй таблице:
    [sql]SELECT m1.id, m1.text
    FROM mytable1 as m1 join
    (select id, sum(voice) as mysum from mytable2 GROUP BY id)
    as t2 on m1.id=t2.id
    ORDER BY t2.mysum DESC
    [/sql]

    UPD:
    Добавляем left outer:
    [sql]SELECT m1.id, m1.text, t2.mysum
    FROM mytable1 as m1 left outer join
    (select id, sum(voice) as mysum from mytable2 GROUP BY id)
    as t2 on m1.id=t2.id
    ORDER BY t2.mysum DESC
    [/sql]

    Правда вместо 0 будет null. По идее должна быть какая нибудь стандартная mysql функция для превращения null в 0 (щас как-то лень искать).
     
  5. gkhelloworld

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

    С нами с:
    18 ноя 2007
    Сообщения:
    311
    Симпатии:
    0
    Адрес:
    PHP.ru
    интересный ход, а как получить результат позиции например ID3 позиция 2

    когда сумму voice я хранил в той же первой таблице у меня позиция вычислялась таким образом

    [sql]SELECT `rowid` FROM (SELECT @n := @n +1 AS `rowid`, `voice`, `id` FROM `mytable1` , (SELECT @n :=0) AS z ORDER BY `voice` DESC) AS x WHERE `id` = '1'[/sql]

    т.е. таблица была такого рода:
    Код (Text):
    1. id text voice
    но теперь, задача поставлена так, чтобы voice хранить в отдельной таблице, вот тут я уже не представляю как вычислить позицию для записи
     
  6. Volt(220)

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

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Запрос в предыдущем комментарии возвращает таблицу которая у Вас и была. Просто сделайте с этой таблицей то же самое что и со старой.
    Далее, посмотрев на получившийся запрос, можно попробовать его упростить.
     
  7. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    [sql]SELECT m1.id, m1.text, IFNULL(t2.mysum,0) mysum
    FROM mytable1 as m1 left outer join
    (select id, sum(voice) as mysum from mytable2 GROUP BY id)
    as t2 on m1.id=t2.id
    ORDER BY t2.mysum DESC[/sql]