对两个日期时间列进行排序,会产生重复的行

时间:2015-11-05 03:50:26

标签: mysql

我有一张桌子,用于记录车辆入口/出口到建筑物。我在显示数据时使用以下过程对进入/退出的existsind日期进行排序,但是它会导致重复的行?有谁知道如何删除重复项?

select id, plate,log_entry,log_exit,logged_by,driver_name,remarks,carimage,flagged
from ((select *, log_entry as filterdate
       from vehicle_log
      ) union all
      (select *, log_exit as filterdate
       from vehicle_log
      )
     ) thelog
where
((log_entry >= _startDate and log_entry <= _endDate) or (log_exit >= _startDate and log_exit <= _endDate))
and plate like concat('%', _plateNumber, '%')
and driver_name like concat('%', _driverName, '%')
order by filterdate desc;

谢谢!

3 个答案:

答案 0 :(得分:0)

你需要解释你想要实现的目标。您正在使用UNIONlog_entrylog_exit进行排序,就像一个字段一样。很公平,我真的不知道这与简单地将log_entrylog_exit排序为两个单独的字段有什么不同。因此,除非你对此有一个很好的解释,否则我说最好的答案是:

SELECT id, plate, log_entry, log_exit, logged_by, driver_name, remarks, carimage, flagged
FROM vehicle_log
WHERE ((log_entry >= _startDate AND log_entry <= _endDate)
    OR (log_exit >= _startDate AND log_exit <= _endDate))
AND plate LIKE CONCAT('%', _plateNumber, '%')
AND driver_name LIKE CONCAT('%', _driverName, '%')
ORDER BY log_entry DESC, log_exit DESC;
您对上次评论的

编辑:要将log_entrylog_exit列合并为一列以进行过滤,并假设它们不能同时为{{1}试试这个:

NULL

这是fiddle

如果您想要SELECT id, plate, log_entry, log_exit FROM #vehicle_log ORDER BY (CASE WHEN log_entry IS NULL THEN log_exit ELSE log_entry END) DESC; 中的合并字段,请尝试以下操作:

SELECT

这是fiddle

答案 1 :(得分:0)

看起来这个查询被设计为给出两行,一行用于输入时间,另一行用于退出时间 - 输出到名为filterdate的列。

通过删除联合以及对退出时间进行排序可以大大简化此查询 - 这是我假设你的事后

select id, plate,log_entry,log_exit,logged_by,driver_name,remarks,carimage,flagged
from vehicle_log
where ((log_entry >= _startDate and log_entry <= _endDate) 
        or (log_exit >= _startDate and log_exit <= _endDate))
      and plate like concat('%', _plateNumber, '%')
      and driver_name like concat('%', _driverName, '%')
order by log_exit desc;

答案 2 :(得分:-1)

为什么不使用distinct?选择不同的ID ...