Вывод данных из mysql в особом порядке

Рейтинг: 1Ответов: 1Опубликовано: 10.10.2014

В БД хранятся товары с трех складов (1,2,3) и с признаком наличия (0,1). Как отсортировать выдачу следующим образом:

Товар с 1 склада, товар со второго склада, товар с третьего склада
Товар с 1 склада, товар со второго склада, товар с третьего склада
Товар с 1 склада, товар со второго склада, товар с третьего склада

и так далее (все в наличии), а затем в том же порядке вывести товары не в наличии.

Упрощенно табличка такая (без лишних полей):

id, stock_id, available, title, price

1, 1, 1, Товар 1, 100.00

2, 3, 1, Товар 2, 520.00

3, 3, 1, Товар 3, 130.00

4, 2, 0, Товар 4, 275.00

...

12653, 1, 1, Товар 12653, 1200.00

Ответы

▲ 2Принят

Залезла ваша задача мне в голову - решился все-таки найти ей решение. Сам я не большой программист и род деятельности далек от подобного, но Интернет ведь один для всех, там-то много велосипедов изобрели уже!
Нашел вопрос, аналогичный вашему с готовым решением и несколько его подправил (как мне кажется, под ваши нужды).

Запрос в итоге выглядит как-то вот так:

SET @a := 0;
SET @b := 0;
SET @c := 0;

SELECT * FROM
(
    SELECT *, @a := @a+1 as `num` FROM `inventory` WHERE `stock_id` = 1

  UNION
  (
    SELECT *, @b := @b+1 as `num` FROM `inventory` WHERE `stock_id` = 2
  )
  UNION
  (
    SELECT *, @c := @c+1 as `num` FROM `inventory` WHERE `stock_id` = 3
  )

) AS `tbl` ORDER BY `available` DESC, `num`, `stock_id`;

Недостаток в том, что available прерывает чередование, хотя от этого никуда не деться - товары не всегда присутствуют на всех складах, и рано или поздно один склад будет доминировать в каких-то позициях.

Да и вообще какая-то непонятка с выводом присутствует (на примере моего фидла):

  1. Чередование начинается неправильно, идет (3), (2,3) (1,2,3) ... (1,2,3), об этом ниже.
  2. Мне так и не удалось понять, почему num начинается с 10, смущает то, что возвращается ведь, как и положено, 30 строк, не меньше.
  3. Опять же num, непонятно, почему num=10 присутствует лишь раз, num=11 - дважды дальше все верно - num=12 и последующие.

Проблема №1 это следствие остальных двух, это понятно. №2 - как-то связанно с выражением количества записей, деленных на количество складов, т.е. логично, что верхний SELECT возвращает результат до трех запросов одновременно. №3 - насколько понимаю, сразу выполняется последний запрос, потом выполняется два последних запроса, потом лишь выполняются все три запроса, а вот почему так, я не смог понять.

Впрочем у вас уже есть от чего отталкиваться, можете взять этот код и обратиться на более узкоспециализирующийся форум, помощью оптимизации/объяснения/доработки.
Думаю, и у нас найдутся умельцы, поэтому я также прошу помощи у них - объяснить, что является причиной проблем №2, №3 стало очень интересно! А также подсказать, насколько эта конструкция правильная в плане быстродействия.

Кстати, вот рабочий фидл.