Position d'un élément basée sur le regroupement d'éléments identiques

Position d'un élément basée sur le regroupement d'éléments identiques - SQL/NoSQL - Programmation

Marsh Posté le 18-10-2017 à 10:31:31    

J'avoue que je galère un peu pour trouver un titre à ma question.
 
Voilà ce que j'ai besoin de faire :
j'ai une table de rendez-vous, chaque rendez-vous est associé à un client. Un client peut avoir plusieurs rendez-vous bien sûr
 
Sur une page d'agenda j'aimerai afficher pour chaque rendez-vous le numéro (position) de ce rendez-vous : est-ce le premier, le second... de ce client
 
j'ai une table "rdv"
rdv_id
client_id
date
 
je fais une petite jointure sur la table "client" pour afficher le nom, prénom...
 
donc ma requête actuelle est du genre :
 

SELECT r.rdv_id, r.client_id, r.date, c.nom, c.prenom
FROM rdv r
INNER JOIN client c ON r.client_id = c.client_id
WHERE r.date BETWEEN '$date1' AND '$date2'
ORDER BY r.date


nota : PHP/MySQL
 
Maintenant pour afficher le numéro de la position du rendez-vous (en se basant sur la date) il faudrait que je fasse un select imbriqué en comptant pour chaque rdv le nombre de rdv du même client_id avec une date inférieur à la date du rdv courant... là j'avoue que je patauge un peu dans la semoule.  
Même chose pour chercher je veux bien des suggestions de mots clés. J'ai trouvé quelques trucs sur stackoverflow mais ça ne répond pas trop à ma demande :(
 
J'aimerai éviter :  
- de refaire 1 requête SQL par rendez-vous
- de stocker la position en BDD parce que c'est généralement encore plus le bazar à gérer (insertion d'un nouveau rendez-vous = il faut tout recalculer et mettre à jour puisque le nouveau peut être entre 2 déjà programmés - le rdv 5 devient 6, le rdv 6 devient 7...) je ferai ça si je m'en sors pas autrement, mais ça me parait overkill.


Message édité par depart le 18-10-2017 à 10:35:31
Reply

Marsh Posté le 18-10-2017 à 10:31:31   

Reply

Marsh Posté le 18-10-2017 à 18:44:01    

Bon je devais être bien embrumé, c'est plus simple qu'il n'y parait, il suffit d'ajouté un sub-select et c'est plié :
 


SELECT r.rdv_id, r.client_id, r.date, c.nom, c.prenom,
(SELECT count(rdv_id) FROM rdv r2 WHERE r2.client_id = rdv.client_id AND r2.date <= rdv.date ) AS position
FROM rdv r
INNER JOIN client c ON r.client_id = c.client_id
WHERE r.date BETWEEN '$date1' AND '$date2'
ORDER BY r.date


 
J'ai cherché trop compliqué...


Message édité par depart le 18-10-2017 à 18:44:16
Reply

Marsh Posté le 22-10-2017 à 11:34:41    

Si tu es sous Oracle tu trouveras ton bonheur avec les fonctions analytiques RANK et DENSE_RANK ;)

Reply

Marsh Posté le 22-10-2017 à 18:03:30    

Le monsieur a dit mysql.
Mais il me semble que MySQL supporte aussi Rank (et les autres window functions) mais j'ai bien peur que ça soit ultra récent, à vérifier.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 23-10-2017 à 10:08:52    

Des suggestions du coup avec rank?

Reply

Marsh Posté le 23-10-2017 à 10:10:10    

Lire la doc, faire une recherche, essayer des trucs ?


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 23-10-2017 à 21:07:23    

TotalRecall a écrit :

Lire la doc, faire une recherche, essayer des trucs ?


Merci pour cette suggestion très utile :o

 

Plus sérieusement l'idée c'est aussi de partager (note que j'ai posté la réponse à mon problème initial, je me suis pas cassé en disant juste "'c'est bon c'est réglé". Certes c'est pas stackoverflow, mais si on peut échanger et partager des expériences c' est sympa.

Reply

Sujets relatifs:

Leave a Replay

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