MySQL-根据最新日期和每列ID列表将行转换为列
即使经过数小时的搜索和尝试,我仍然无法理解这一点。也许我没有选择正确的词语 好的,我有一张表,上面有这样的事件:MySQL-根据最新日期和每列ID列表将行转换为列,mysql,sql,pivot-table,greatest-n-per-group,groupwise-maximum,Mysql,Sql,Pivot Table,Greatest N Per Group,Groupwise Maximum,即使经过数小时的搜索和尝试,我仍然无法理解这一点。也许我没有选择正确的词语 好的,我有一张表,上面有这样的事件: EVENT +----+------------+------------+------+ | id | id_article | id_section | date | +----+------------+------------+------+ | 1 | 1 | 1 | 2011 | | 2 | 1 |
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_部分列表中的最新事件(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 |
+----+------------+------------+------+
截面A=id_截面(1,2,3,4,5)和最大值(日期)
节B=id_节(6,7,8,9,10)和最大值(日期)
第C节=第(11,12,13,14,15)节中的id和最大值(日期)
期望的结果
+------------+----------+----------+-----------+
|id|U文章| A部分| B部分| C部分| id|U事件
+------------+----------+----------+-----------+
|1 | 3(2012)| null | null | id 2
|2 | null | 6(2014)| null | id 4
|3 | 0(2017)| null | 13(2016)|#id 7,6根据您当前的查询,我对子查询做了一些更改,以确定每个id|u文章上有多个部分时的最大值。此外,第A部分的列表中应包括0
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
如果有关系的话?@GordonLinoff也许会选择id更高的(活动)谢谢!(是的,我忘记了零)有可能用这个创建一个视图吗?我需要它作为php中网格的数据源?:)
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)