我被另一个开发人员创建的MySQL表所困扰。它是一个假日游轮表,其中包含目的地,船只和航行日期等字段(以及其他字段)。
Destinations Ships Sailing Dates
Antarctica MS QE2 2 Dec 2018, 1 Jan 2019
Antarctica MS TBS 2 Feb 2019, 3 Mar 2019
Antarctica MS JRB 9 Nov 2018, 5 Dec 2018
如所示,每艘船可以有多个航行日期,以逗号分隔的文本输入。但是我只对每行的第一个航行日期感兴趣。
例如,“ 2018年12月2日”是第一行的第一个日期。同样,“ 2019年2月2日”是第二行的第一个日期,依此类推。
我需要一个PHP SELECT语句在每行的第一个日期对整个表进行排序。为简化起见,我想到了将另一个日期字段添加到表中,并将每行的第一个日期复制到该新日期字段中,然后根据该字段对表进行排序的方法。但这是一种环回解决方案,我不喜欢。
是否有一个简单的PHP / SQL语句可以实现这一目标?我想到了PHP Explode()函数。但是我不确定如何将其合并到SELECT语句中。任何帮助将不胜感激。
更新:感谢您的建议。我完全同意,这张桌子是一团糟。假设我将日期移动到新表中,旧表中的每一行都有多个行,如下所示。
Destinations Ships Voyage ID
Antarctica MS QE2 1
Antarctica MS TBS 2
Antarctica MS JRB 3
日期表
-航程ID ------航行日期
------- 1 ------------ 2018年12月2日
------- 1 ------------ 2019年1月1日
------- 2 ------------ 2019年2月2日
------- 2 ------------ 2019年3月3日
------- 3 ------------ 2018年11月9日
------- 3 ------------ 2018年12月5日
现在,我应该使用什么SQL命令按新DATES表中每个Voyage ID的开始日期对旧表进行排序。
答案 0 :(得分:2)
您正遭受着可怕的数据库设计之苦。您只需要一张桌子,而不是一张桌子就可以坐船,一张桌子就可以到达目的地,一张桌子就可以实际旅行。这不是关系数据库应该的。
此外,日期不存储为日期,而是存储为字符串,并且一个字符串中甚至可以包含多个日期。几乎不会更糟。 所以最好的建议是重新编写整个数据库。
如果您不想重新设计数据库或不允许这样做,那么我的建议是:不要尝试在SQL查询中解决这个问题。只需从数据库中读取所有记录,然后在PHP中进行字符串操作和排序即可。