1

Je ne peux toujours pas comprendre cela, même après des heures de recherche et d'essai. Peut-être que je n'ai pas choisi les bons mots?MySQL - Convertir les lignes en colonnes en fonction de la dernière date et la liste des ID pour chaque colonne

Ok, donc je table avec des événements comme celui-ci:

EVENT 
+----+------------+------------+------+ 
| id | id_article | id_section | date | 
+----+------------+------------+------+ 
| 1 |   1 |   1 | 2011 | 
| 2 |   1 |   3 | 2012 | 
| 3 |   2 |   7 | 2013 | 
| 4 |   2 |   6 | 2014 | 
| 5 |   3 |   14 | 2015 | 
| 6 |   3 |   13 | 2016 | 
| 7 |   3 |   0 | 2017 | 
+----+------------+------------+------+ 

Je voudrais pivoter ce tableau en trois colonnes différentes où chaque colonne contient derniers événements (id_section et Date) dans la liste de id_section. Eh bien, essentiellement comme ceci:

SectionA = id_section IN (1,2,3,4,5) et MAX (date)

SectionB = id_section IN (6,7,8,9 , 10) et MAX (date)

= id_section section C IN (11,12,13,14,15) et MAX (date)

DESIRED RESULT 
+------------+----------+----------+-----------+ 
| id_article | sectionA | sectionB | sectionC | #id_event 
+------------+----------+----------+-----------+ 
|   1 | 3 (2012) | null  | null  | #id 2 
|   2 | null  | 6 (2014) | null  | #id 4 
|   3 | 0 (2017) | null  | 13 (2016) | #id 7, 6 <-- two latest events 
+------------+----------+----------+-----------+ 

Voici SqlFiddle de ce que j'ai r ight maintenant - il sélectionne uniquement le dernier événement par id_article:

INSUFFICIENT RESULT 
+------------+----------+----------+-----------+ 
| id_article | sectionA | sectionB | sectionC | #id_event 
+------------+----------+----------+-----------+ 
|   1 | 3 (2012) | null  | null  | #id 2 
|   2 | null  | 6 (2014) | null  | #id 4 
|   3 | 0 (2017) | null  | null  | #id 7 <-- only latest event 
+------------+----------+----------+-----------+ 

J'ai essayé d'utiliser plus REJOINT mais je ne peux toujours pas comprendre.

Merci pour toute aide! En fonction de votre requête actuelle, j'ai fait quelques changements sur la sous-requête pour identifier le maximum s'il y a plusieurs sections sur chaque id_article

+0

Et s'il y a des liens? –

+0

@GordonLinoff alors peut-être choisir cela avec id plus élevé (événement) –

Répondre

0

En outre, 0 doit être inclus dans la liste des SectionA

SELECT e1.id_article, 
     MAX(CASE WHEN section = 'SectionA' 
       THEN CONCAT(e2.id_section, ' (', e2.date, ')') END) AS sectionA, 
     MAX(CASE WHEN section = 'SectionB' 
       THEN CONCAT(e2.id_section, ' (', e2.date, ')') END) AS sectionB, 
     MAX(CASE WHEN section = 'SectionC' 
       THEN CONCAT(e2.id_section, ' (', e2.date, ')') END) AS sectionC 
    FROM event e1 
INNER JOIN (SELECT a.id_article, 
        a.id_section,  
        a.`date`, 
        a.section, 
        COUNT(*) row_number 
       FROM (SELECT *, 
          CASE WHEN id_section IN (0,1,2,3,4,5) 
           THEN 'SectionA' 
           WHEN id_section IN (6,7,8,9,10) 
           THEN 'SectionB' 
           WHEN id_section IN (11,12,13,14,15) 
           THEN 'SectionC' 
          END section 
         FROM `event`) a 
       INNER JOIN (SELECT *, 
            CASE WHEN id_section IN (0,1,2,3,4,5) 
             THEN 'SectionA' 
             WHEN id_section IN (6,7,8,9,10) 
             THEN 'SectionB' 
             WHEN id_section IN (11,12,13,14,15) 
             THEN 'SectionC' 
            END section 
          FROM `event`) b 
       ON a.id_article = b.id_article 
       AND a.section = b.section 
       AND a.`date` <= b.`date` 
       GROUP BY a.id_article, 
         a.id_section,  
         a.`date` 
      ) e2 
    ON e1.id_article = e2.id_article 
    AND e1.date = e2.date 
WHERE e2.row_number = 1 
GROUP BY e1.id_article 

Résultat

id_article sectionA sectionB sectionC 
1   3 (2012) (null)  (null) 
2   (null)  6 (2014) (null) 
3   0 (2017) (null)  13 (2016) 
+0

Merci beaucoup! J'ai oublié le zéro –

+0

:) –

+0

Est-il possible de créer en quelque sorte une vue avec cela? J'ai besoin de cela comme source de données pour la grille en php? :) –