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

dandandan

Мой дом здесь!
Регистрация
7 Авг 2008
Сообщения
1.036
Реакции
292
Есть база
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 строк?
 
Код:
(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 для второго запроса совсем не нужно.
 
ORDER BY rayting DESC попало случайно из первого запроса.
А про лимит мне как-то спокойнее, что будет получено всего одно значение. При этом выборка сразу же остановится при достижении этого значения. В противном случае будет пройдена вся таблица...
 
А про лимит мне как-то спокойнее, что будет получено всего одно значение. При этом выборка сразу же остановится при достижении этого значения. В противном случае будет пройдена вся таблица...
и всё таки использовать лимит для поиска ключевого поля не совсем логично. а что будет если айди который вы указываете не существует в таблице? тогда и лимит не поможет.
в одном из советов по оптимизации есть такое
3. Используйте LIMIT 1, если нужно получить уникальную строку

Иногда, во время использования запроса, вы уже знаете, что ищете только одну строку. Вы можете получить уникальную запись или просто проверить существование любого количества записей, которые удовлетворяют предложению WHERE.
В таком случае добавление LIMIT 1 к вашему запросу может улучшить производительность. При таком условии механизм базы данных останавливает сканирование записей как только найдет одну и не будет проходит по всей таблице или индексу.
типа
$r = mysql_query("SELECT * FROM user WHERE state = 'Alabama' LIMIT 1");
но в вашем случае ситуация совершенно иная (а так скорее всего и есть, также latteo правильно и логично предположил). если это ключевое поле, то пользы от лимита совершенно никакой, кроме как лишнего кода.
если хотите ещё немного облегчить запрос и нагрузку - вместо * указывайте только те поля, которые будут использоваться от результата выборки, только учтите, что для юниона нужно чтоб две выборки возвращали одинаковые по структуре массивы данных (рекордсеты).
 
Чисто с точки зрения оптимизации - зачем напрягать сервер UNION'ом если (может) быть всё таки можно отказаться от требования одного запроса? Сделайте 2 запроса и не парьтесь - это будет вариант получше с точки зрения производительности.
 
Назад
Сверху