Как сделать сортировку по шаблону в MySQL? (order by pattern (cat1, cat2, cat3; cat1, cat2, cat3; …)

138
24 декабря 2019, 23:30

Есть модель "Канал"

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

Есть модель "Микс"

+---------------------+--------------+------+-----+---------+----------------+
| Field               | Type         | Null | Key | Default | Extra          |
+---------------------+--------------+------+-----+---------+----------------+
| id                  | int(11)      | NO   | PRI | NULL    | auto_increment |
| title               | varchar(255) | YES  |     | NULL    |                |
| channel_id          | int(11)      | YES  | MUL | NULL    |                |
| on_channel          | tinyint(1)   | NO   |     | 0       |                |
+---------------------+--------------+------+-----+---------+----------------+

Каждый микс принадлежит какому либо каналу.

Запрос на вывод всех миксов из канала 1, 5 и 15:

"SELECT `mixes`.* FROM `mixes` WHERE `mixes`.`on_channel` = 1 AND `mixes`.`channel_id` IN (1, 5, 15)"
+------+-------------------------------------+------------+
| id   | title                               | channel_id |
+------+-------------------------------------+------------+
|  879 | It's Disco time! MILO 8             |          5 |
|  882 | ElectroDiscoFunkEklektika           |          1 |
|  891 | Pleasure Pizza                      |          5 |
|  953 | Elite Disco Funk                    |         15 |
|  958 | Special mix for Cottonmouth Podcast |          5 |
|  967 | Disco on the way                    |          1 |
|  998 | okoloDISKO #9 for FLAT.FM           |         15 |
| 1119 | Some Funk For Your Ass              |          5 |
| 1267 | GET PHONKEY WITH YOU                |         15 |
| 1272 | Friendly Vibes Mix                  |          5 |
+------+-------------------------------------+------------+

Вопрос: как сделать так, чтобы сортировка была в порядке channel_id = (1, 5, 15) итерационно, т.е.

+------+-------------------------------------+------------+
| id   | title                               | channel_id |
+------+-------------------------------------+------------+
|  882 | ElectroDiscoFunkEklektika           |          1 |
|  879 | It's Disco time! MILO 8             |          5 |
|  953 | Elite Disco Funk                    |         15 |
|  967 | Disco on the way                    |          1 |
|  891 | Pleasure Pizza                      |          5 |
|  998 | okoloDISKO #9 for FLAT.FM           |         15 |
|  958 | Special mix for Cottonmouth Podcast |          1 |
| 1119 | Some Funk For Your Ass              |          5 |
| 1267 | GET PHONKEY WITH YOU                |         15 |
| 1272 | Friendly Vibes Mix                  |          1 |
+------+-------------------------------------+------------+
Answer 1

Для MySQL 5.x:

SELECT `channel`, `title`
FROM (
  SELECT 
      @row_number:=CASE
          WHEN @channel_id = `channel_id` THEN @row_number + 1
          ELSE 1
      END AS num,
      @channel_id:=`channel_id` as `channel`,
      `title`
  FROM
      `mixes`
  WHERE `on_channel` = 1
    AND `channel_id` IN (1, 5, 15)
  ORDER BY `channel_id`
) `q`
ORDER BY `num`, `channel`

Пример на SQLFiddle

READ ALSO
Неизвестный оператор. (near “WITH” at position 0)

Неизвестный оператор. (near “WITH” at position 0)

Возникает ошибка при попытке использовать with в панели phpMyAdmin, как я понимаю phpMyAdmin использует MySQL, а в нем есть with, но вот у меня он никак его...

133
#1146 - Таблица 'test.tree' не существует

#1146 - Таблица 'test.tree' не существует

Ошибка #1146 - Таблица 'testtree' не существует возникает в этом коде

138
Поиск в двух таблицах MySQL с объединением результатов

Поиск в двух таблицах MySQL с объединением результатов

Доброе утро! Возникла такая необходимость: есть две таблицы

115