选择最近日期与多列匹配

时间:2016-11-19 22:43:11

标签: php mysql sql innodb

首先,我不确定SQL是否是我应该采取的大部分路线,因为我对它很新,但这里有:

我有一个包含多列日期的数据库,并且在不经过的情况下,我希望按顺序获取具有最接近的相应日期的行。 然后我用PHP显示信息。

希望这能解释我之后的事情:

c_date = 0001/01/01;

e_id |  e_date_1  |  e_date_2  |  e_date_3
--------------------------------------------
  0  | 0001/01/02 | 0001/01/15 | 0001/02/02
--------------------------------------------
  1  | 0001/01/08 | 0001/01/12 | 0001/01/17 
--------------------------------------------
  2  | 0001/01/02 | 0001/01/13 | 0001/02/12 
--------------------------------------------
  3  | 0000/12/29 | 0001/01/01 | 0001/02/12
--------------------------------------------
  4  | 0001/01/24 | 0001/02/01 | 0001/02/12

0.1& 2.1在第一列中最接近,但3.2比0.2更接近,使得3选择#1 0.1& 2.1是相同的,但2.2比0.2更接近2,选择#2 等

决赛: 3,2,0,1,4

任何人都可以帮助我朝正确的方向发展吗?我一直在阅读手册和教程,但似乎似乎没有提供我正在寻找的解决方案。 也许我正在以错误的方式存储数据?我不确定。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我想要的数据选择的逻辑并不清楚,但几乎毫无疑问,如果数据是标准化形式,那么无论你想做什么都可以更容易地完成。

如果您可以将数据存储在不同的结构中,那么您应该通过使用单个列来存储与不同日期列对应的标识符来规范化数据结构。这样的表定义如下:

创建表e_dates(    e_id整数,    e_date_id整数,    e_date日期    );

当前表的第一行对应于此规范化表中的三行,其值为:    (0,1,1001 / 01/02)    (0,2,1000 / 01/15)    (0,3,0001/01/15)

答案 1 :(得分:1)

这是你想要的吗?

select e_id
from ((select e_id, e_date_1 as e_date from t) union all
      (select e_id, e_date_2 as e_date from t) union all
      (select e_id, e_date_3 as e_date from t)
     ) t
group by e_id
order by min(abs(datediff(c_date, d_date));

这将根据三个日期中最近的一个返回e_id