如何对具有多个值的字段上的MySQL表进行排序

时间:2018-09-19 09:06:53

标签: php mysql

我被另一个开发人员创建的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的开始日期对旧表进行排序。

1 个答案:

答案 0 :(得分:2)

您正遭受着可怕的数据库设计之苦。您只需要一张桌子,而不是一张桌子就可以坐船,一张桌子就可以到达目的地,一张桌子就可以实际旅行。这不是关系数据库应该的。

此外,日期不存储为日期,而是存储为字符串,并且一个字符串中甚至可以包含多个日期。几乎不会更糟。 所以最好的建议是重新编写整个数据库。

如果您不想重新设计数据库或不允许这样做,那么我的建议是:不要尝试在SQL查询中解决这个问题。只需从数据库中读取所有记录,然后在PHP中进行字符串操作和排序即可。