Mysql - Как упорядочить результаты чередуя (1,2,3, 1, 2, 3, 1, 2, 3,) строк, это возможно? - PullRequest
2 голосов
/ 24 декабря 2009

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

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

Есть идеи? GROUP BY может быть?

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

Ответы [ 5 ]

7 голосов
/ 24 декабря 2009

Использование:

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 в подзапросе должен гарантировать, что клиенты в порядке.

0 голосов
/ 24 декабря 2009

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

0 голосов
/ 24 декабря 2009

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

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

ORDER BY FLOOR(project_id / 10), client_id

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

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

LIMIT 10, 10

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

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

0 голосов
/ 24 декабря 2009

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

SELECT *
FROM table
WHERE client_id in (1, 2, 3)
ORDER by id, client_id
0 голосов
/ 24 декабря 2009

Почему бы не ORDER BY id?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...