Mysql – Как мне упорядочить результаты, чередуя (1,2,3, 1, 2, 3, 1, 2, 3) строки, возможно ли это?
Вопрос
Я хочу упорядочить результаты по клиентам 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
Похоже, что-то нужно сделать на стороне клиента.