[Q] Concaténer les résultats sur un champs...

Concaténer les résultats sur un champs... [Q] - SQL/NoSQL - Programmation

Marsh Posté le 27-12-2012 à 18:28:58    

Hello, disons j'ai 2 tables de ce type:
 
user
id_user
name_user
 
phone
id_phone
number_phone
#id_user

 
Il peut donc y avoir 0, 1 ou plusieurs numéro de tél (number_phone) par utilisateur.
je peux tout afficher en faisant :

Code :
  1. select user.name_user, phone.number_phone
  2. from user
  3. left outer join phone
  4.    on phone.id_user = user.id_user


 
Ca m'affiche un truc du style :
user1 phone1
user1 phone2
user1 phone3
user2 phone1
user3
user4 phone1
user4 phone2

 
J'aimerais obtenir plutot un résultat du type :
user1 phone1,phone2,phone3
user2 phone1
user3
user4 phone1,phone2

 
C'est possible, sans surcharger le serveur (SQL Server) ?
 [:ojap]

Reply

Marsh Posté le 27-12-2012 à 18:28:58   

Reply

Marsh Posté le 28-12-2012 à 09:05:20    

Pour faire court, oui c'est possible mais c'est encore 100x mieux si tu le fais au niveau de ton application ou de ton interface.
 
SGBD = Doué pour comparer/traiter des colonnes
Application = Doué pour comparer/traiter des lignes

Reply

Marsh Posté le 28-12-2012 à 09:48:56    

J'ai pas d'application ou interface :'(
Les requêtes sont envoyées en direct depuis une interface web, je n'ai pas la main sur les sources de la dite interface...

Reply

Marsh Posté le 28-12-2012 à 17:30:19    

Une fois que tu as recu la reponse de SQL tu en fais quoi?
 
Si tu dois l'afficher quelque part en utilisant du php ou de l'asp tu peux utiliser ca pour formater tout correctement.

Reply

Marsh Posté le 28-12-2012 à 18:40:21    

Le résultat apparait dans la même interface web, puis il est exportable en csv ou xml.
Mais le résultat doit directement être exploitable depuis la page web, donc tout doit se passer dans la requête.

 

Si j'avais eu accès à une interface entre la requête et son exploitation bien sûr que je l'aurais utilisée pour soulager le serveur mais aussi pour éviter de me prendre la tête :o

Reply

Marsh Posté le 31-12-2012 à 08:40:49    

Voila deux facon differente de le faire:

Code :
  1. SELECT a.name_user, SUBSTRING((
  2.     SELECT ', ' + b.number_phone
  3.     FROM @phone b
  4.     WHERE b.id_user = a.id_user
  5.     FOR XML PATH(''), TYPE
  6.     ).value('.','varchar(max)'), 2, 9999) number_phone
  7. FROM @user a
  8.  
  9. ;With ctePhone (id_user, number_phone, rn, rnR) AS
  10.     (
  11.         SELECT a.name_user
  12.              , b.number_phone
  13.              , ROW_NUMBER() OVER (PARTITION BY a.name_user ORDER BY a.name_user, b.number_phone) rn
  14.              , ROW_NUMBER() OVER (PARTITION BY a.name_user ORDER BY a.name_user DESC, b.number_phone DESC) rnR
  15.         FROM @user a
  16.             LEFT JOIN @phone b ON b.id_user = a.id_user
  17.     ),
  18.     cteRec (id_user, number_phone, rn, rnR) AS
  19.     (
  20.         SELECT id_user, CONVERT(varchar(max),number_phone) number_phone, rn, rnR
  21.         FROM ctePhone
  22.         WHERE rn = 1
  23.         UNION ALL
  24.         SELECT a.id_user, CONVERT(varchar(max),b.number_phone + ', ' + a.number_phone) number_phone, a.rn, a.rnR
  25.         FROM ctePhone a
  26.             JOIN cteRec b ON b.id_user = a.id_user AND a.rn = b.rn + 1
  27.     )
  28. SELECT id_user, number_phone
  29. FROM cteRec
  30. WHERE rnR = 1
  31. ORDER BY id_user


 
Ce n'est pas performant et ca ne scale pas du tout, donc ce n'est bon que pour un petit nombre de user.
Un SGBD ce n'est pas fait pour sortir des data qui doivent etre affichée directement, si il y a du formatage a faire ou de la mise en page ca doit etre fait par la couche applicative.


Message édité par Oliiii le 31-12-2012 à 08:44:24
Reply

Marsh Posté le 04-01-2013 à 14:55:11    

Hello,
 
Merci ! J'ai pour l'instant testé uniquement la première solution.
Je suis satisfait du temps d'exécution et du résultat.
 
Je vais tenter de comparer le temps d'exécution avec la deuxième solution qui me paraît moins facile à intégrer à ma requête [:arkns:4]

Reply

Marsh Posté le 09-01-2013 à 00:34:56    

Heu... GROUP_CONCAT ?
 
C'est un peu fait pour ça les gars ;)


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 09-01-2013 à 08:19:16    

Ca n'existe pas en SQL Server.

Reply

Marsh Posté le 10-01-2013 à 22:37:19    

Oups.
 
Ça démontre bien que SQL Server c'est de la merde.


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 10-01-2013 à 22:37:19   

Reply

Marsh Posté le 11-01-2013 à 11:42:12    

Chaque SGBD a des avantages et inconvenient, aucun des gros SGBD n'est pourris, ils excellent tous dans leur domaine.

Reply

Sujets relatifs:

Leave a Replay

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