[ЗАКРЫТО] [MySQL] Узнать позицию в списке

kruzer25

Хочется выбрать одну строку таблицы. у которой ID из заданного списка, причём имеет наименьшую позицию в списке; иначе - наименьший ID - то есть, например, для списка (3,2) в первую очередь должна подойти строка с ID=3, во вторую - с ID=2, в третью - с ID=1, в четвёртую - с ID=4 ну и дальше - по возрастанию ID...
Как это можно сделать одним запросом?

kruzer25

^

skvoria

Ээээх, блин, упорядочивание множеств...
SELECT id, FIND_IN_SET( id, concat_ws( ',', 4, 3 ) )
FROM test
ORDER BY ( id IN ( 4, 3 ) ) DESC,
FIND_IN_SET( id, concat_ws( ',', 4, 3 ) ) ASC,
id ASC;
За использование строковых функций - низачот

kruzer25

За функцию FIND_IN_SET - огромное спасибо, у меня работает, а где вообще можно такие функции искать?
Вчера перерыл весь refman mysql - ничего такого не нашёл, и такую функцию он не знает...

skvoria

Хммм. Ну, я электронным мануалом пользуюсь, .chm.
Взял, кажется, с сайта mysql. Могу кинуть, если надо (3.5М)

kruzer25

Отсюда?
А к какой версии?

skvoria

1.1. About This Manual
This is the Reference Manual for the MySQL Database System. It documents MySQL up to Version 5.0.4-beta, but is also applicable for older versions of the MySQL software (such as 3.23 or 4.0-production) because functional changes are indicated with reference to a version number.
Because this manual serves as a reference, it does not provide general instruction on SQL or relational database concepts. It also does not teach you how to use your operating system or command-line interpreter.
The MySQL Database Software is under constant development, and the Reference Manual is updated frequently as well. The most recent version of the manual is available online in searchable form at http://dev.mysql.com/doc/. Other formats also are available, including HTML, PDF, and Windows CHM versions.
Это на первой страничке моего файла написано.

kruzer25

thx

kruzer25

Кстати,
SELECT `id` FROM `test` ORDER BY FIND_IN_SET(`id`,concat_ws(',',3,4 DESC,`id` ASC
выглядит покрасивее, хоть и изврат получается с переворачиванием множества.

rosali

Можно же написать UNION и не париться? или это не "одним запросом"?

kruzer25

UNION подойдёт, если в множестве один-два-три элемента, да и то это - изврат.
А если их тысяча?

durka82

И в чем изврат?
И чем он так хуже для больших множеств относительно других решений?

kruzer25

Приведи пример запроса.
Или я чего-то не понимаю, или ты предлагаешь для множества из тысячи элементов делать UNION из тысячи SELECT'ов?

durka82

Нет, я предлагаю сделать UNION запросов, выбирающего строку по списку и выбирающего строку по возрастанию.

kruzer25

запросов, выбирающего строку по списку
ЧТобы в этом запросе данные были упорядочены по позиции в списке - всё равно надо испоьльзовать что-то типа FIND_IN_SET (или делать запрос с тысячей UNION'ов).
Оставить комментарий
Имя или ник:
Комментарий: