1

即使经过数小时的搜索和尝试,我仍然无法弄清楚。也许我没有选择正确的话?MySQL - 根据每列的最新日期和ID列表将行转换为列

好了,所以我有表,像这样的活动:

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日期id_section。好了,基本上是这样的:

部1. = id_section IN(1,2,3,4,5)和MAX(日期)

sectionB = id_section IN(6,7,8,9 10)和MAX(日期)

sectionC = id_section IN(11,12,13,14,15)和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

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

我试图用更JOINS,但我仍然无法弄清楚: - 飞行现在它只是每id_article选择最新的事件。

感谢您的帮助!

+0

如果有关系? –

+0

@GordonLinoff然后可能选择更高的ID(事件) –

回答

0

根据您当前的查询,我对子查询进行了一些更改,以识别每个id_article上有多个节的最大值。同时,0应列入名单部1.

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中的网格? :) –