[mysql] Выбрать топ 10 и еще id = '25'

Тема в разделе "Базы данных", создана пользователем dandandan, 11 фев 2013.

Модераторы: latteo
  1. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Есть база
    id rayting
    1 50
    2 75
    .....
    25 100

    Нужно выбрать ТОП 10 (наибольшее значение) по рейтингу и еще один запрос с id = "25".
    Если id = "25" входит в топ 10, то это значение должно дублировать 2 раза. В топ 10 и в 11 строке.

    Вот выбор ТОП 10
    PHP:
    SELECT FROM db WHERE 1 ORDER BY rayting DESC LIMIT 0,10
    Вот выбор нужной строки с id
    PHP:
    SELECT FROM db WHERE id="25" ORDER BY rayting DESC LIMIT 0,1
    Как это объединить в 1 запрос с минимизацией нагрузки на БД и получить 11 строк?
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.185
    Код:
    (SELECT * FROM db ORDER BY rayting DESC LIMIT 0,10)
    union all
    (SELECT * FROM db where id = 25)
    
    Примичание:
    - скобки для запросов обязательны,
    - WHERE 1 - плохой стиль кода,
    - если id уникален (как правило он уникален), то условие ORDER BY rayting DESC LIMIT 0,1 для второго запроса совсем не нужно.
     
    dandandan и Шумадан нравится это.
  3. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    ORDER BY rayting DESC попало случайно из первого запроса.
    А про лимит мне как-то спокойнее, что будет получено всего одно значение. При этом выборка сразу же остановится при достижении этого значения. В противном случае будет пройдена вся таблица...
     
  4. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.722
    Симпатии:
    2.097
    и всё таки использовать лимит для поиска ключевого поля не совсем логично. а что будет если айди который вы указываете не существует в таблице? тогда и лимит не поможет.
    в одном из советов по оптимизации есть такое
    но в вашем случае ситуация совершенно иная (а так скорее всего и есть, также latteo правильно и логично предположил). если это ключевое поле, то пользы от лимита совершенно никакой, кроме как лишнего кода.
    если хотите ещё немного облегчить запрос и нагрузку - вместо * указывайте только те поля, которые будут использоваться от результата выборки, только учтите, что для юниона нужно чтоб две выборки возвращали одинаковые по структуре массивы данных (рекордсеты).
     
  5. intellion

    intellion Создатель

    Регистр.:
    25 ноя 2007
    Сообщения:
    11
    Симпатии:
    0
    Чисто с точки зрения оптимизации - зачем напрягать сервер UNION'ом если (может) быть всё таки можно отказаться от требования одного запроса? Сделайте 2 запроса и не парьтесь - это будет вариант получше с точки зрения производительности.