J'ai un problème avec une requête SQL. J'ai deux tables.

Mon premier tableau :

+------------+-------------+---------------+
| id_mission | Some column | Other column  |
+------------+-------------+---------------+
|      1     |     ...     |      ...      |
|      2     |     ...     |      ...      |
+------------+-------------+---------------+

Mon deuxième tableau :

+------------+-------------+---------+
| id_mission | id_category | points  |
+------------+-------------+---------+
|          1 |           1 |       3 |
|          1 |           2 |       4 |
|          1 |           3 |       4 |
|          1 |           4 |       8 |
|          2 |           1 |      -4 |
|          2 |           2 |       3 |
|          2 |           3 |       1 |
|          2 |           4 |      -7 |
+------------+-------------+---------+

Et j'aimerais avoir ce genre de résultat avec ma requête SELECT

+------------+-------------+--------------+---------------+----------------+
| id_mission | Some column | Other column | id_category 1 | id_category X  |
+------------+-------------+--------------+---------------+----------------+
|          1 |         ... |          ... |           ... |            ... |
|          2 |         ... |          ... |           ... |            ... |
+------------+-------------+--------------+---------------+----------------+

J'ai essayé avec les deux premières colonnes mais ça ne marche pas, j'ai aussi essayé GROUP_CONCAT, ça marche mais ce n'est pas le résultat que je veux.

SELECT m.id_mission ,mc.id_category 1,mc1.id_category 2
from mission m 
left join mission_category mc on m.id_mission = mc.id_mission 
left join mission_category mc1 on m.id_mission = mc1.id_mission

Est-ce que quelqu'un peut m'aider?

1
FistiPaul 7 sept. 2020 à 16:45

1 réponse

Meilleure réponse

Vous pouvez utiliser l'agrégation conditionnelle. En supposant que vous souhaitiez faire pivoter la valeur points par catégorie :

select 
    t1.*,
    max(case when t2.id_category = 1 then points end) category_1,
    max(case when t2.id_category = 2 then points end) category_2,
    max(case when t2.id_category = 3 then points end) category_3
from t1
inner join t2 on t2.id_mission = t1.id_mission
group by t1.id_mission
    

Cela suppose que id_mission est la clé primaire de t1 (sinon, vous devez énumérer les colonnes souhaitées dans les clauses select et group by).

2
GMB 7 sept. 2020 à 13:54