Как стать автором
Обновить

Комментарии 12

хм, не сочтите критикой, поидее подобную задачу можно решить одним подобным запросом

SELECT * FROM (
(SELECT a2.* FROM
(SELECT * FROM t1 where name = «name1») a1, t1 as a2
WHERE a2.rait < a1.rait ORDER BY a2.rait DESC LIMIT 2 )
UNION (
SELECT a2.* FROM
(SELECT * FROM t1 where name = «name1») a1, t1 as a2
WHERE a2.rait > a1.rait ORDER BY a2.rait ASC LIMIT 2 )
UNION
(SELECT * FROM t1 where name = «name1»)
) as itog
ORDER BY itog.rait DESC

В данном случае есть таблица с двумя полями name и rait
запрос выдает в 5 строчек (2 с рейтингом больше, 1 строчка — искомый пользователь, 2 строчки с рейтингом меньше)

Критика всегда приветствуется, если она конструктивная. Мне Ваш вариант понравился. Выглядит не так очевидно, но работает, шустрее моего.
Немного видоизменил, получилось следующее:
select * from (

 (select * from rating where points > (select points from rating where uid = 7808) order by points desc limit 5)
    union
 (select * from rating where points < (select points from rating where uid = 7808) order by points desc limit 5)
    union
 (select * from rating where uid = 7808)

 ) rating
order by rating.points desc;


* This source code was highlighted with Source Code Highlighter.
На троечку. Оба не очень понимаете что пишете, т.к. не учитываете вариант, когда разные пользователи набрали одинаковое количество очков. В одном select должно быть нестрогое неравенство и исключение самого пользователя из выборки; либо дополнительно сортировать по уникальному полю: id, login.
Ну мне кажется автор не задачу тут показывает как решить, а больше рассказывает о хранимых процедурах. А показать это проще всего на несложном и понятном для всех примере. Я не прав?
а что помешало автору селект (seleсt * from rating_tmp;) вставить в саму ХП?
В этом случае пропал бы смысл создавать временную таблицу.
да вы что?

а с вынесением этого селекта из процедуры пропадает смысл во всей процедуре.
Мне почему то кажется, что для обучения начинающих категорически противопоказано приводить примеры кода, на которые можно сразу вешать вывеску "!!! Никогда не делайте так !!!!"

Зачем нужно создавать временную таблицу?
Что бы количество кода и время выполнения увеличить?
:-)
Других причин я не вижу.

Автор пишет:
>Так как нам понадобиться возвращать результат из процедуры, а именно выборку, состоящую из [6..11]
>строк, то для ее хранения будем использовать временную таблицу, создаваемую при вызове
>процедуры. К слову сказать, получить результат запроса, выполненного в теле хранимой процедуры,
>можно и другим способом, но мы не будем его сейчас затрагивать.

Зачем хранить результат?

Какой другой способ?

Есть ощущение, что автор абсолютно не понимает как работают хранимые процедуры как они возвращают результат(ы).
Да, отлично!
А теперь расскажи нам как хранимые процедуры должны возвращать (сложные и/или объемные) результаты.
Убедительная просьба — почитайте плиз мануал.
Вообще-то я писал, что результат запроса из тела хранимой процедуры можно получить другим способом. Я лишь рассмотрел вариант с временной таблицей.

Я не буду отрицать, что я новичок в MySQL. Уверен, что здесь есть такие же люди. Истина рождается в споре, так что лучше выносить разноплановые вопросы на обсуждение, тогда и процесс обучения и получения знаний будет происходить намного быстрее.

К примеру, @Horus20 подсказал свой вариант я из него кое-что извлек, за что ему спасибо.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории