Jointure sur un nombre inconnu de données

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Jointure sur un nombre inconnu de données

Re: Jointure sur un nombre inconnu de données

par Spols » 21 mars 2012, 21:28

C'est vachement sympa de poser une question portant sur max(),
"je voudrais récupérer l'année de dernière cotisation de chaque membre"
de tester, peut-être une réponse, de la balayer d'un trait de plume, et bien sûr de ne pas "dévoiler" la solution qu'on a trouvée.
Je me suis peut être mal exprimé sur mon questionnement, j'ai volontairement simplifié, du fait que je n'ai pas un mais 3 champs dans le même cas, je ne peux donc pas partir du champs et de sa table mais bien de la table user.

Quand à ma solution, j'ai décrit le principe 2 posts au dessus, et ma requète complète ne vous aiderait en rien elle m'est propre.

Je remercie ceux qui ont essayé de m'aider, je trouve les réponses et les aides de ce forum toujours très bien faite.

Re: Jointure sur un nombre inconnu de données

par sirakawa » 21 mars 2012, 20:39

d'autant que
salut,

dans ce style la :

select max(année) from table group by (user)

(rajoute la jointure ;)

@+
une fois traduit en termes de cotisations:
select max(cotis), id from cotis group by id ;

Re: Jointure sur un nombre inconnu de données

par sirakawa » 21 mars 2012, 20:33

C'est vachement sympa de poser une question portant sur max(),
"je voudrais récupérer l'année de dernière cotisation de chaque membre"
de tester, peut-être une réponse, de la balayer d'un trait de plume, et bien sûr de ne pas "dévoiler" la solution qu'on a trouvée.

Re: Jointure sur un nombre inconnu de données

par Spols » 20 mars 2012, 14:34

Avec cette requète, je vais obtenir une liste de toutes les cotisations dont l'année est égale à l'année maximum qu'un membres à payer. Si j'en ai un qui paye pour les 10 ans à venir, jen'aurais que lui comme réponse.

Mais j'ai finalement trouvé la requète qu'il me fallait, elle gère tout ce que j'ai besoin. Je vous l'épargne car elle est très longue et dévoile ma structure ce que je ne désire pas.

Re: Jointure sur un nombre inconnu de données

par sirakawa » 20 mars 2012, 09:38

Il ne me semble pas que je répète ce qu'on a déjà dit:
select * from cotisations where cotis =(select max(cotis) from cotisations);

Re: Jointure sur un nombre inconnu de données

par Spols » 20 mars 2012, 00:16

Le problème semble proche d'un autre présenté dans ce même forum [Casse-tête] MySQL, agrégation, maximum

Ajouter juste un GROUP BY me fait perdre le delta correspondant d'après ce que j'ai compris.
Utiliser l'autre solution de requète imbriqué me semble compliqué vu que j'ai en fait 3 jointures de ce type à faire.

Dans un premier temps, Je vais savoir me débrouiller pour ma première questions, car je vais chercher le delta max, t après coup si il est > à 0 une requète supplémentaire sera effectué.

J'ai tenté de faire un mix des deux solutions de l'autre sujet, un GROUP BY et une UNION, mais il semble que les champs de la première requète ne sont pas utilisable dans la requète suivante. Me trompès-je ?

Pour ma deuxième question, j'ai trouvé une solution sur cette page [mySQL] concat de plusieurs enregistrement
Avec quelques arrangement telle qu'un DISTINCT car sinon j'avais des doubles lié au fait qu'il peut y avoir plus de cotisation pour un users que d'e-mail (et vice-versa en thèorie)

Merci de vos réponses, elle m'ont fait réfléchir pour trouver ma solution idèale
exemple :

Code : Tout sélectionner

GROUP_CONCAT(DISTINCT CONCAT(champs9.field_email_value)ORDER BY champs9.delta ASC SEPARATOR ', ') AS emails

Re: Jointure sur un nombre inconnu de données

par moogli » 18 mars 2012, 23:48

salut,

dans ce style la :

select max(année) from table group by (user)

(rajoute la jointure ;)

@+

Jointure sur un nombre inconnu de données

par Spols » 18 mars 2012, 11:42

Bonjour à tous,

Je cherche à faire des jointures un peu spécial
Je commence par décrire une version simplifié de la structure de ma base

Une table user, avec un uid unique et différentes infos personnelles.
Une table cotisations avec une association uid & delta comme clé unique et l'année où il ont cotisé.
un petit exemple au cas où je suis pas clair
l'user avec l'uid = 9 à payer pour les années 2012, 2013 et 2014, il y aurait donc trois lignes

Code : Tout sélectionner

uid delta annee 9 0 2012 9 1 2013 9 2 2014
PS la valeur du delta est toujours croissante avec les années

Je cherche à faire 2 choses bien distinctes

1)
Je voudrais récupérer l'année de dernière cotisation de chaque membres
J'aurais bien vu quelque chose comme cela :
SELECT [les champs utiles]
FROM user
LEFT JOIN cotisation ON cotisation.uid = user.uid AND MAX(cotisation.annee)
WHERE ...
Mais cela ne fonctionne pas, tous ce que j'ai lu concernant l'utilisation de max est de l'utilisé dans la partie SELECT, mais cela m'empèche d'avoir une liste des utilisateurs avec les dernières années de cotisation. Y a t il une technique qui vous viendrai à l'esprit pour ce genre de requète ?

2)
Je voudrais récupérer pour chaque user, une liste, tableaux ou autre (selon les possibilités) des années payées. Comment pourrais je faire sachant qu'il y a un nombre indéfini de ligne par user.

PS Je ne peux changer la structure de mes tables étant dans un CMS (Drupal avec Profile2 pour les connaisseurs)