2017-09-15 1 views
0

J'ai 3 tables avec une relation plusieurs-à-plusieurs. Je veux sélectionner pour l'utilisateur spécifique et la dernière ligne insérée pour ce produit.MySQL sélectionner ligne avec des conditions spécifiques et la dernière ligne insérée pour ces conditions dans plusieurs à plusieurs

Table 'utilisateur' contient des informations personnelles de l'utilisateur:

userID  persID  firstName  lastName  gender 
42   9559000 Jane   Rae   female 
43   9559001 John   Doe   male 
. 
. 
. 

Table 'storage1' contient des informations sur le produit:

storageID  product  productAttribute  productSize  storageQTY 
1    shirt  red     S    10 
2    shirt  blue     M    10 
. 
. 
. 
13   shirt  green    L    10 
14   shirt  green    XL    9 
15   shirt  green    XXL    7 
. 
. 
39   trousers male     60    10 
40   trousers male     62    8 
. 
. 
59   shoes  standard    41    10 
60   shoes  standard    42    7 
61   shoes  standard    43    10 
62   shoes  standard    44    10 
63   shoes  standard    45    9 
. 
. 
72   jacket  red     L    10 
73   jacket  red     XL    9 
74   jacket  red     XXL    6 

et de table activityRecords:

recordsID  userID  storageID  startDate  expDate 
99   43   15   2017-09-14 
100   43   74   2017-09-14 
101   43   39   2017-09-14 
102   43   13   2017-09-14 
103   43   14   2017-09-14 
104   43   40   2017-09-14 
105   43   14   2017-09-14 
106   43   63   2017-09-14 
107   43   59   2017-09-14 

Jusqu'à présent, je avoir ce code qui résulte uniquement de la valeur maximale du produit lié à un utilisateur spécifique.

select 
     persID, 
     firstName, 
     lastName, 
     gender, 
     max(case when storage1.product = 'shoes' then storage1.productSize end) shoes, 
     max(case when storage1.product = 'trousers' then storage1.productSize end) trousers, 
     max(case when storage1.product = 'shirt' then storage1.productSize end) shirt, 
     max(case when storage1.product = 'shirt' then storage1.productAttribute end) color, 
     max(case when storage1.product = 'jacket' then storage1.productSize end) jacket, 
     startDate, 
     expDate 
    from activityRecords 
     left join user on activityRecords.userID = user.userID 
     left join storage1 on activityRecords.storageID = storage1.storageID 
    where persID='9559001' 
    group by persID, firstName, lastName, gender, startDate, expDate 
    order by persID 

qui résultent ceci:

persID  firstName  lastName  gender  shoes  trousers  shirt  color  jacket  startDate  expDate 
9559001 John   Doe   male  45  null   null  null  null  2017-09-14 
9559001 John   Doe   male  null  62   null  null  null  2017-09-14 
9559001 John   Doe   male  null  null   XXL  green  null  2017-09-14 
9559001 John   Doe   male  null  null   null  null  XXL  2017-09-14 

mais je veux obtenir ceci:

persID  firstName  lastName  gender  shoes  trousers  shirt  color  jacket  startDate  expDate 
9559001 John   Doe   male  41  null   null  null  null  2017-09-14 
9559001 John   Doe   male  null  62   null  null  null  2017-09-14 
9559001 John   Doe   male  null  null   XL  green  null  2017-09-14 
9559001 John   Doe   male  null  null   null  null  XXL  2017-09-14 

parce que les chaussures numéro 41 est la dernière entrée pour les chaussures dans le tableau activityRecords (recordsID 107) et taille de chemise XL est la dernière entrée pour chemise dans la table activityRecords (recordsID 105). Alors que maintenant il y a des chaussures sélectionnées recordsID 106 et shirt select est recordsID 99. Je sais que cela est lié à cause de mon code de sélection (en utilisant max (cas quand ...)), mais je ne sais pas comment sélectionner entrée la plus récente pour un produit et une personne spécifiques. Tout le monde peut m'aider avec ça? Merci

Répondre

0

Je vous suggère de procéder avec des sous-requêtes ou des vues afin d'obtenir votre résultat plus facilement.

Views Syntax Reference

Vous pouvez créer une vue pour chaque produit tel que:

create view shirt_activity_view 
as select 
    ar.userID, 
    ar.recordsID, 
    s1.productSize as shirt, 
    s1.productAttribute as color, 
    ar.startDate, 
    ar.expDate 
from activityRecords as ar 
    inner join storage1 as s1 
    on ar.storageID = s1.storageID 
    and s1.product = 'shirt'; 

Si vous voulez obtenir la dernière activité de chemise pour tous les utilisateurs:

select 
    * 
from shirt_activity_view 
inner join (
    select 
     userID, 
     max(startDate) as max_start_date 
    from shirt_activity_view 
    group by userID 
) as max_dates 
    on shirt_activity_view.userID = max_dates.userID 
and shirt_activity_view.startDate = max_dates.max_start_date 

Vous pourrait utiliser cette dernière requête comme une nouvelle vue ou comme une sous-requête dans une requête plus complexe.

De cette façon, vous pouvez même obtenir une structure Aplatir pour toutes vos données (en utilisant toutes les colonnes que vous attendez dans votre jeu de résultats)

+0

il montre plus d'une dernière ligne, mais il est ok pour moi. Merci – tomas