Mysql – Как мне упорядочить результаты, чередуя (1,2,3, 1, 2, 3, 1, 2, 3) строки, возможно ли это?

StackOverflow https://stackoverflow.com/questions/1959414

  •  21-09-2019
  •  | 
  •  

Вопрос

Я хочу упорядочить результаты по клиентам 1, 2, 3, затем снова по клиентам 1, 2, 3 и так далее.

Есть ли способ сделать это без использования цикла for или выполнения трех отдельных запросов?Мало того, я работаю с данными с разбивкой на страницы, поэтому им нужно возвращать x результатов, но последовательно.

Есть идеи?ГРУППИРОВАТЬ ПО, может быть?

client_id  project_id  project_name  
---------- ----------  ------------
 1         42          project abc
 2         49          project xyz
 3         41          project 123
 1         22          project apple
 2         29          project orange
 3         21          project banana
Это было полезно?

Решение

Использовать:

SELECT x.client_id, 
       x.project_id,
       x.project_name
  FROM (SELECT t.client_id,
               t.project_id,
               t.project_name,
               CASE
                 WHEN @client_id != t.client_id THEN @rownum := 0
                 WHEN @client_id = t.client_id THEN @rownum := @rownum + 1
                 ELSE @rownum 
               END AS rank,
               @client_id := t.client_id
          FROM TABLE t,
               (SELECT @rownum := 0, @client_id
      ORDER BY t.client_id) r) x
ORDER BY x.rank, x.client_id

MySQL не имеет функции ранжирования, но, к счастью, вы можете использовать переменные.Ключевым моментом был сброс значения @rownum, когда client_id не соответствует предыдущему client_id — ORDER BY в подзапросе предназначен для обеспечения того, чтобы клиенты были в порядке.

Другие советы

Почему нет ORDER BY id?

GROUP BY не поможет.Возможно ли это, во многом будет зависеть от ваших данных.По сути, вам понадобится запутанный ORDER BY который что-то взломал на основе других ценностей.

Например, используя приведенный вами пример данных, вы можете использовать:

ORDER BY FLOOR(project_id / 10), client_id

Это вряд ли будет полезно для ваших реальных данных, но дает представление о том, что вам нужно будет взять отдельное поле, сделать некоторые подмножества этих данных эквивалентными для целей сортировки (в данном случае все с одинаковым значением 10 с). и есть вторичная сортировка по client_id.

Хотя это во многом зависит от окончательной формулы, нечто подобное должно быть относительно стабильным, поэтому добавление нумерации страниц, например через

LIMIT 10, 10

должен возвращать последовательные результаты.

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

Если я неправильно прочитал вопрос, этого ли вы хотите?

SELECT *
FROM table
WHERE client_id in (1, 2, 3)
ORDER by id, client_id

Похоже, что-то нужно сделать на стороне клиента.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top