2017-09-19 1 views
0

J'ai un problème compliqué, et je ne suis pas très bon avec MYSQL. J'espère que quelqu'un pourra m'aider.
J'ai 2 tables. Un extrait de ces tableaux:Sélectionnez les valeurs maximales d'une colonne groupée par une colonne différente de 2 tables jointes

  1. Members_per_year

ID | Member_ID | Business_year_ID | AS_ID
1 ........... 1 ............................ 56 ..... .............. 12
10004 ... 1 ............................ 55 ................... 12
10005 ... 1 ...................... ...... 54 ................... 10002 ... 1 ................ ............ 57 ................... 30
2 ........... 2 .. .......................... 58 ................... 40
3 ........... 3 ............................ 58 ......... .......... 27

  1. Année

ID | Business_year
54 ...... 2012-2013
55 ...... 2013-2014
56 ...... 2014-2015
57 ...... 2015-2016
58 ...... 2016-2017

Ce que j'essaie de faire est de combiner les deux tables sur Members_per_year. Business_year_ID et les colonnes Year.ID. Après quoi, je veux regrouper les données par Member_ID, donc je récupère 1 ligne par membre. Le hic, c'est que ce devrait être les données avec le plus grand Business_year pour ce membre. J'ai réussi à créer une requête, mais cela ne fonctionne pas correctement. La requête est:

SELECT Member_ID, Business_year_ID, MAX(Year.Business_year), Year.ID AS YearID, AS_ID 
FROM Members_per_year 
INNER JOIN Year ON Members_per_year.Business_year_ID = Year.ID 
GROUP BY Member_ID 

Et il retourne:

MEMBER_ID | Business_year_ID | MAX (Year.Business_year) | YearID | AS_ID
1 ........................... 56 .................. ............. 2015-2016 .................... 56 .......... 12
2 ........................... 58 ..................... .......... 2016-2017 .................... 58 .......... 40
3 .. ......................... 58 ........................ ....... 2016-2017 .................... 58 .......... 27

Il renvoie le bon max Business_year, mais les Business_year_ID et YearID associés sont incorrects. Fondamentalement, il sélectionne la première valeur pour le Business_year_ID et le MAX pour Business_year. Pas le Business_year_ID correspondant au MAX (Business_year). Est-ce que quelqu'un a une idée de ce qui se passe et comment le résoudre?

Edit:
Je cherche délibérément la Business_year et non pour le Business_year_ID. Il s'agit d'une mesure de précaution, dans le cas où l'ID supérieur n'est pas égal à une année commerciale supérieure.

+0

Les valeurs retournées pour les expressions non agrégées dans la liste SELECT sont indéterminées si ces expressions Aren 't inclus dans la clause 'GROUP BY'. Nous pouvons demander à MySQL de lancer une erreur (similaire au comportement d'un autre SGBDR) si nous incluons 'ONLY_FULL_GROUP_BY' dans le sql_mode. La valeur renvoyée pour la colonne 'YearID' provient de * une * ligne du groupe. Ce n'est pas nécessairement à partir de la ligne avec la valeur maximale de 'BusinessYear'.) Le comportement documenté ici: https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html – spencer7593

+0

@ spencer7593 Oui , Je pensais que quelque chose de similaire se passait. C'est un peu ennuyeux de choisir seulement la valeur max, et non la ligne correspondant à la valeur max. – Barna

Répondre

0

Vous avez besoin d'un sous-requête pour obtenir l'année maximum par membre, puis rejoindre le résultat avec les tables d'origine:

select b.*, c.* 
from (
    select Member_ID, max(Business_year_ID) y 
    from Members_per_year 
    group by Member_ID) a 
join Members_per_year b on a.Member_ID = b.Member_ID and a.y = b.Business_year_ID 
join Year c on b.Business_year_ID = c.ID; 
+0

Merci pour votre réponse. J'ai essayé votre proposition dans PHPMyadmin, mais elle a dit que la requête n'est pas correcte. Je pense qu'il a un problème avec une parenthèse après la clause from. L'erreur est: "Une expression était attendue. (Near()". Et il y en a quelques autres mais probablement liés à la même erreur. (Elle a un problème avec le second SELECT, fermant le crochet et avec "a") – Barna

+0

Je vois que vous avez recherché MAX (Business_year_ID) alors que j'ai besoin du maximum de Year.Business_year pour le même membre, donc j'ai besoin de chercher un MAX de la table commune. – Barna