Я хочу что-то вроде этого:
$st = $db->query("select * from posts where position = 'slider' order by inde asc");
PLUS
$st = $db->query("select * from posts where position = 'right' order by inde asc");
PLUS
$st = $db->query("select * from posts where position = 'below' order by inde asc");
Поэтому строки должны быть выбраны с использованием этого позиционного порядка (ползунок справа внизу), но каждая группа внутри себя должна быть упорядочена по индексу.
Любая помощь?
Используйте ORDER BY FIELD()
. FIELD()
возвращает позицию значения в данном списке значений.
SELECT *
FROM posts
WHERE position IN ('slider', 'right', 'below')
ORDER BY FIELD(position, 'slider', 'right', 'below'), inde
Простейшим решением будет такой запрос:
SELECT p.*
FROM posts p
WHERE p.position IN ('slider','right','below')
ORDER
BY p.position DESC
, p.inde ASC
(Мы замечаем, что порядок значений position
может быть основан на строковых значениях... мы знаем, что 's' > 'r' > 'b'
.
Если бы мы нуждались в них в другом порядке, мы могли бы использовать выражение для декодирования значений позиции в значениях, которые можно было бы отсортировать с помощью ORDER BY. (И есть несколько возможных шаблонов и широкий спектр выражений, которые мы могли бы использовать.)
Если требование состоит в том, чтобы запустить три отдельных запроса (по соображениям производительности?), Что-то вроде этого также вернет указанный результат:
( SELECT p.* FROM posts p WHERE p.position = 'slider' ORDER BY p.inde )
UNION ALL
( SELECT p.* FROM posts p WHERE p.position = 'right' ORDER BY p.inde )
UNION ALL
( SELECT p.* FROM posts p WHERE p.position = 'below' ORDER BY p.inde )
(MySQL также позволит нам добавить ORDER BY после последнего paren, чтобы отсортировать весь набор, если мы хотим более явно выразить требование для заказа результата.)
ORDER BY FIELD
никогда не может использовать индекс