1

数時間の検索と試してもまだこれを理解することはできません。たぶん私は正しい言葉を選んでいないでしょうか?MySQL - 最新の日付と各列のIDのリストに基づいて列に変換する

わかりましたので、私はこのようなイベントを持つテーブルがあります。私は、リスト内の各列は、最新のイベント(id_section日付)が含まれている三つの異なる列にこの表をピボットしたい

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 | 
+----+------------+------------+------+ 

id_sectionです。

sectionA(1,2,3,4,5)IN = id_sectionとMAX(日付)

sectionB = id_section IN(6,7,8,9-:まあ、基本的にこのような、10)とMAX(日付))11,12,13,14,15(IN

sectionC = id_sectionとMAX(日付)

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 
+------------+----------+----------+-----------+ 

は、ここで私はR持っているもののSqlFiddleです私はより多くのJOINSが、私はまだそれを把握することはできませんを使用しようとした

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 
+------------+----------+----------+-----------+ 

: - IGHT今だけid_articleあたり、最新のイベントを選択します。

ありがとうございました!

+0

とつながりがある場合のために、リストに含まれるべき? –

+0

@ GordonLinoff次に、より高いid(イベント)でそれを選ぶかもしれない –

答えて

0

現在のクエリに基づいて、各id_articleに複数のセクションがある場合、maxを識別するためにサブクエリにいくつか変更を加えました。また、0は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 

結果

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

ありがとう! (はい、私はゼロを忘れました) –

+0

ようこそ。 :) –

+0

何とかこれでビューを作成することは可能ですか?私はPHPのグリッドのデータソースとしてこれが必要ですか? :) –

関連する問題