выбрать по группам - упорядочено по значению

0

Я хочу что-то вроде этого:

$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");

Поэтому строки должны быть выбраны с использованием этого позиционного порядка (ползунок справа внизу), но каждая группа внутри себя должна быть упорядочена по индексу.

Любая помощь?

Теги:

2 ответа

2
Лучший ответ

Используйте ORDER BY FIELD(). FIELD() возвращает позицию значения в данном списке значений.

SELECT *
FROM posts
WHERE position IN ('slider', 'right', 'below')
ORDER BY FIELD(position, 'slider', 'right', 'below'), inde
  • 0
    Действительно, простой в использовании недостаток состоит в том, что ORDER BY FIELD никогда не может использовать индекс
  • 0
    Есть и другие способы сделать это, но я не думаю, что кто-либо из них будет использовать индекс.
Показать ещё 1 комментарий
2

Простейшим решением будет такой запрос:

  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, чтобы отсортировать весь набор, если мы хотим более явно выразить требование для заказа результата.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню