За последние 24 часа нас посетили 62182 программиста и 1796 роботов. Сейчас ищут 835 программистов ...

Выборка из базы строк, исключая повторы

Тема в разделе "MySQL", создана пользователем MasterDmx, 27 сен 2015.

  1. MasterDmx

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

    С нами с:
    17 авг 2014
    Сообщения:
    31
    Симпатии:
    0
    Всем привет.
    Есть таблица с данными, пример:

    id | type | percent
    1 | micro | 80
    2 | micro | 92
    3 | big | 60
    4 | min | 100
    5 | big | 70

    Мне необходимо вывести по 1 строке одного типа с сортировкой по полю percent, т.е должно получится так:

    id | type | percent
    4 | min | 100
    2 | micro | 92
    5 | big | 70

    С сортировкой все понятно, все беда с исключением дублей по полю type...
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    DISTINCT, ORDER BY
     
  3. MasterDmx

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

    С нами с:
    17 авг 2014
    Сообщения:
    31
    Симпатии:
    0
    Если брать дистинкт, то можно будет указать только одно поле. Как в таком случае получить значения и других полей?
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Для подобных выборок есть группировка. Типа:
    Код (Text):
    1. SELECT type, MAX(percent) AS percent
    2. FROM mytable
    3. GROUP BY type
    При группировке во фразе SELECT должны быть только поля из GROUP BY и агрегаты от других полей.
    Нельзя просто взять и подставить сюда еще id! Даже если не будет сообщения об ошибке, получишь не то, что ожидаешь.
    Но можно результат группировки объединить с той же таблицей и получить все поля:
    Код (Text):
    1. SELECT t2.*
    2. FROM
    3.   (SELECT type, MAX(percent) AS percent
    4.    FROM mytable
    5.    GROUP BY type) AS t1 JOIN
    6.   mytable AS t2 USING(type, percent)
    Другой вариант: объединение с собой с необычным условием объединения:
    Код (Text):
    1. SELECT t1.id, t1.type, t1.percent
    2. FROM
    3.   mytable AS t1 LEFT JOIN
    4.   mytable AS t2 ON t1.type=t2.type AND t1.percent < t2. percent
    5. WHERE t2.id IS NULL
     
  5. MasterDmx

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

    С нами с:
    17 авг 2014
    Сообщения:
    31
    Симпатии:
    0
    artoodetoo, большое спасибо, ваш пример очень помог, задача выполнена.

    Не поможете еще с одним вопросом. Для примера подойдет та же таблица выше. Задача сделать выборочную сортировку по типу (т.е. по полю type)
    Если использовать "ORDER BY type,percent" то сортировка выполнится корректно, т.е. сначала данные отсортируются по type а потом по percent, однако будет выполнятся алфавитная сортировка.
    Есть ли возможность вручную указать порядок типов, например: micro, big, min. То есть сначала отберутся поля micro, потом big и потом min.
     
  6. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    можно. гуглить mysql order by list of values - много разнообразных решений.
     
  7. MasterDmx

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

    С нами с:
    17 авг 2014
    Сообщения:
    31
    Симпатии:
    0
    Ganzal, спасибо. Нашел необходимую информацию с помощью вашего запроса.
    Помогла следующая конструкция:
    Код (PHP):
    1. SQL> SELECT * FROM CUSTOMERS
    2.     ORDER BY (CASE ADDRESS
    3.     WHEN 'DELHI'      THEN 1
    4.     WHEN 'BHOPAL'      THEN 2
    5.     WHEN 'KOTA'      THEN 3
    6.     WHEN 'AHMADABAD' THEN 4
    7.     WHEN 'MP'     THEN 5
    8.     ELSE 100 END) ASC, ADDRESS DESC; 
    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]