Mysql - Comment puis-je commander des résultats en alternant (1,2,3, 1, 2, 3, 1, 2, 3,) les lignes, est-il possible?

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

  •  21-09-2019
  •  | 
  •  

Question

Je veux commander mes résultats par client 1, 2, 3, puis de nouveau client 1, 2, 3, et ainsi de suite.

Est-il possible de le faire sans utiliser une boucle ou de faire trois requêtes distinctes? Non seulement cela, mais je travaille avec des données paginés donc il a besoin pour retourner des résultats x, mais toujours.

Toutes les idées? GROUP BY peut-être?

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
Était-ce utile?

La solution

Utilisation:

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 ne possède pas de fonctionnalité de classement, mais heureusement, vous pouvez utiliser des variables. La clé a été la réinitialisation de la valeur @rownum lorsque le client_id ne correspond pas au client_id précédent -. ORDER BY dans la sous-requête est de faire en sorte que les clients sont en ordre

Autres conseils

Pourquoi ne pas ORDER BY id?

GROUP BY ne va pas être utile. Que ce soit possible va dépendre beaucoup de vos données. Fondamentalement, vous auriez besoin d'un ORDER BY alambiquée qui piraté quelque chose ensemble basé sur d'autres valeurs.

Par exemple, en utilisant l'exemple des données que vous avez données, vous pouvez utiliser:

ORDER BY FLOOR(project_id / 10), client_id

Il est peu probable d'être utile sur vos données réelles mais il donne l'idée que vous devez prendre un champ distinct, faire des sous-ensembles de ces données soient équivalentes aux fins de tri (dans ce cas, tout avec le même 10s valeur) et ont une sorte secondaire client_id.

Bien que cela dépend beaucoup de la formule finale, quelque chose comme cela devrait être une sorte relativement stable, afin d'ajouter la pagination, par exemple via

LIMIT 10, 10

doit renvoyer des résultats cohérents.

Bien sûr, en faisant cela signifie que vous obtenez aucun avantage d'avoir des indices, donc si vous avez beaucoup de lignes, il finira par être plus lent que de faire quelque chose avec des boucles / requêtes distinctes.

À moins que je lis la mauvaise question est ce que vous voulez?

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

On dirait quelque chose à faire côté client.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top