Problème de tri d'enregistrements

Problème de tri d'enregistrements - SQL/NoSQL - Programmation

Marsh Posté le 19-06-2012 à 10:37:50    

Bonjour,
 
Voilà, j'ai un pb de tri pour une requête sql concernant un BD Mysql. J'ai 3 tables :
Actions (ActionID, ActionTitle...)
ActionHistory (ActionHistoryID, ActionID, SupportMemberID...)
SupportMembers (SupportMemberID, SupportMemberLastname...)
 
En gros, j'ai une table contenant des actions pouvant être affectées à 0, 1 ou plusieurs personnes d'une équipe (0 = action pas encore affectée). Pour info, la table SupportMembers sert dans d'autres tables, raison pour laquelle on ne trouve pas en clé étrangère ActionID dans cette table.
 
Mon pb est le suivant : je voudrais trier les actions dans l'ordre alphabétique croissant/décroissant de leur personnes affectées.
Ex :
A1 affectée à Titi et Tata
A2 affectée à Tutu et Lala
A3 affectée à Lala
 
En sortie, je devrais avoir :  
A3 (car Lala)
A2 (car Lala, Tutu)
A1 (car Tata, Titi)
 
Ca paraît simple, mais je sèche... :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 19-06-2012 à 10:37:50   

Reply

Marsh Posté le 20-06-2012 à 07:49:39    

Le probleme c'est qu'un SGBD normal est fait pour comparer des colonnes avec des colonnes, ici tu compares des rows aussi.
 
En gros, faire ce que tu veux avec juste un seul nom c'est facil, le faire avec un order by nom1, nom2, nomx... c'est moins marrant :)
 
Il y a moyen (du moins en SQL Server) en fesant une premiere query qui assemble tout les noms et une deuxieme qui fait le order by mais ce n'est ni performant ni elegant :)
 
A mon avis le plus facil c'est de faire ce genre de tri dans l'appli.

Reply

Marsh Posté le 20-06-2012 à 08:01:55    

Sinon ya ca comme "solution", ca ne donne pas toujours ce que tu veux mais c'est un moyen de s'en raporcher sans trop se casser la tete:

Code :
  1. SELECT a.ActionTitle, MIN(c.SupportMemberLastName), MAX(c.SupportMemberLastName)
  2. FROM @Actions a
  3.     JOIN @ActionHistory b ON b.ActionID = a.ActionID
  4.     JOIN @SupportMembers c ON c.SupportMemberID = b.SupportMemberID
  5. GROUP BY a.ActionTitle
  6. ORDER BY MIN(c.SupportMemberLastName), MAX(c.SupportMemberLastName)

Reply

Marsh Posté le 20-06-2012 à 09:58:43    

Merci pour ta réponse. Entre temps, j'ai trouvé une solution mais j'ai laissé le topic ouvert pour voir les propositions faites. La tienne se rapproche beaucoup de ma solution (utilisation de min ou max sur SupportMemberLastName). Sauf que comme j'avais d'autres clauses dans le where, notamment concernant d'autres champs de l'historique ActionHistory (j'avais simplifié le pb lors de mon exposition), j'ai mis la requête que tu proposes dans une sous-requête pour que la table ActionHistory servant au filtrage d'actions à afficher ne "pollue" pas son utilisation dans la clause order by. Par contre, pour le group by, je l'ai fait sur ActionID et non ActionTitle, certaines actions pouvant avoir le même titre... ;)
 
Mais merci encore pour ta solution qui a confirmé que la mienne n'était pas débile ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-06-2012 à 08:48:43    

Tu peux peut-être utiliser la récursion pour dans un premier temps, trier par action / nom et ensuite assembler les X noms ensemble.
Je l'ai déjà fait sur une base en db2, ça fonctionne. Je ne sais pas si c'est possible en MySql par contre.

 

http://sqlpro.developpez.com/cours [...] ves/#LIV-D


Message édité par vave le 21-06-2012 à 08:49:09

---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

Marsh Posté le 22-06-2012 à 11:00:48    

Si je comprend ton idée, je pense que ça revient à faire une sous-requête comme Oliiii l'a proposé (et ce que j'ai fait également)...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed