Mysql 如何从行到列显示日期序列

Mysql 如何从行到列显示日期序列,mysql,rows,Mysql,Rows,具有主字段idPeriod和几百条记录的表周期。 表date_类带有idPeriod和dateClass 还有要显示的名称。每个名字都有相同的句号和5个日期 每个周期有5个日期 +-----------+------------+ | idPeriode | dateClass | +-----------+------------+ | 302367 | 2020-02-18 | | 302367 | 2020-02-25 | | 302367 | 2020-03-03 |

具有主字段idPeriod和几百条记录的表周期。 表date_类带有idPeriod和dateClass 还有要显示的名称。每个名字都有相同的句号和5个日期

每个周期有5个日期

+-----------+------------+
| idPeriode | dateClass  |
+-----------+------------+
|    302367 | 2020-02-18 |
|    302367 | 2020-02-25 |
|    302367 | 2020-03-03 |
|    302367 | 2020-03-10 |
|    302367 | 2020-03-17 |
+-----------+------------+
我想展示:

+----------+---------------------+------------+------------+------------+------------+
| Name     | Period | Date1      | Date2      | Date3      | Date4      | Date5      |
+----------+---------------------+------------+------------+------------+------------+
| Bousquet | 302367 | 2020-02-18 | 2020-02-25 | 2020-03-03 | 2020-03-10 | 2020-03-17 |
| Grignon  | 302367 | 2020-02-18 | 2020-02-25 | 2020-03-03 | 2020-03-10 | 2020-03-17 |
| Rajotte  | 302367 | 2020-02-18 | 2020-02-25 | 2020-03-03 | 2020-03-10 | 2020-03-17 |
| Vandal   | 302367 | 2020-02-18 | 2020-02-25 | 2020-03-03 | 2020-03-10 | 2020-03-17 |
| Tessier  | 302367 | 2020-02-18 | 2020-02-25 | 2020-03-03 | 2020-03-10 | 2020-03-17 |
| Beauvais | 302367 | 2020-02-18 | 2020-02-25 | 2020-03-03 | 2020-03-10 | 2020-03-17 |
+----------+--------+------------+------------+------------+------------+------------+

有点不清楚为什么要这样做,但通过在查询中实现一些函数是可以实现的。有关示例,请参阅以下查询:

SELECT NAME, idperiode,
       SUBSTRING_INDEX(dateclass,',',1) AS date_1,
       SUBSTRING_INDEX(SUBSTRING_INDEX(dateclass,',',2),',',-1) AS date_2,
       SUBSTRING_INDEX(SUBSTRING_INDEX(dateclass,',',3),',',-1) AS date_3,
       SUBSTRING_INDEX(SUBSTRING_INDEX(dateclass,',',4),',',-1) AS date_4,
       SUBSTRING_INDEX(dateclass,',',-1) AS date_5
FROM       
(SELECT NAME,
       idperiode,
       GROUP_CONCAT(dateclass ORDER BY dateclass) AS dateclass 
 FROM mytable
 GROUP BY NAME, idperiode) A;
第一部分是一个子查询,使用
GROUP\u CONCAT
组合所有日期(假设所有日期仅在一个表中)。然后使用
SUBSTRING\u INDEX
分隔分组日期


如果有两个没有关系的表,那么您可以在表上使用
交叉联接
。我还对子查询进行了轻微修改,而外部查询的功能仍然相同。

始终以1周为间隔?idPeriodd不能是主键,因为它不是唯一的。哪个MySQL版本?为什么要为一堆名称重新创建同一行?这可以在应用程序中完成。这组名字来自哪里?它们是否等同于每个idPeriode?是什么将名称字段绑定到idPeriode或dateClass字段中?1)大多数时间间隔为1周;但是偶尔会有一节课被推迟,并且会在序列的末尾添加一个日期(额外的一周)-更改的一周的日期将不再出现-它将保持52)在第二个表中(date_类)。关键是idPeriod+DateClass谢谢-这很有趣-我需要调整它,但这是一个非常好的开始。