如何根据Mysql中的日期过滤重复的行?

时间:2015-05-07 15:28:25

标签: mysql left-join

我有两张桌子

表1名称: depot_tracking

     -------------------------------------------------
    depot_tracking_id | cont_details_id |    date    |
    -------------------------------------------------
           1          |       4         | 05-02-2015 |
           2          |       1         | 25-03-2015 |
           3          |       3         | 05-04-2015 |
           4          |       2         | 15-02-2015 |
           5          |       3         | 05-05-2015 |
           6          |       2         | 23-03-2015 |
           7          |       1         | 15-05-2015 |
    --------------------------------------------------

第二个表名: cont_details

      -----------------------------------
          cont_no      | cont_details_id | 
       -----------------------------------
           aa          |       1         |
           bb          |       2         |
           cc          |       3         |
           dd          |       4         | 
           ee          |       5         |
           ff          |       6         |
           gg          |       7         |
    --------------------------------------

现在我想合并这两个表并过滤重复的行,另外一个最重要的是我必须过滤具有OLDER日期的行。这正是我期待的输出

     ---------------------------------------------------------
    depot_tracking_id | cont_details_id |    date    | cont_no
    ----------------------------------------------------------
           1          |       4         | 05-02-2015 |  dd
           5          |       3         | 05-05-2015 |  cc
           6          |       2         | 23-03-2015 |  bb
           7          |       1         | 15-05-2015 |  aa
    ---------------------------------------------------------

请一些人帮我过滤重复的行(过滤具有旧日期行的行)谢谢

ORDER BY (str_to_date(date,'%d-%m-%Y')) DESC LIMIT 1 

通过使用此代码我可以将日期列(DD-MM-YYYY)更改为mysql格式日期

但不知道如何根据日期过滤重复的行

3 个答案:

答案 0 :(得分:1)

因为使用聚合函数可以可靠地确定所有字段值,所以只需要一个简单的聚合查询。

select max(d.depot_tracking_id), c.cont_details_id, max(d.date), c.cont_no
  from depot_tracking d
    inner join cont_details c
      on c.cont_details_id = d.cont_details_id
  group by c.cont_details_id

为了使其正常工作,您的日期字段必须是实际日期类型,而不是字符串类型。或者如果它们是字符串类型,它们需要是&yyyy-mm-dd'格式,而不是' dd-mm-yyyy'。

demo here

更新

由于您似乎使用了破碎的日期格式 - 此查询将起作用:

select max(d.depot_tracking_id), c.cont_details_id, max(str_to_date(d.date,'%d-%m-%Y')), c.cont_no
  from depot_tracking d
    inner join cont_details c
      on c.cont_details_id = d.cont_details_id
  group by c.cont_details_id

demo

答案 1 :(得分:1)

http://sqlfiddle.com/#!9/113ed/1

SELECT 
d.depot_tracking_id,
c.cont_details_id,
d.`date`,
c.cont_no
FROM depot_tracking d
LEFT JOIN depot_tracking d1
ON d.cont_details_id = d1.cont_details_id
  AND d.`date` < d1.`date`
LEFT JOIN cont_details c
ON c.cont_details_id = d.cont_details_id
WHERE d1.`date` IS NULL

答案 2 :(得分:1)

首先,MySQL不会在&#dd-mm-yyyy&#39;中存储日期。格式,但在&#39; yyyy-mm-dd&#39;。如果您使用的是date类型,则以下解决方案将起作用。如果不是,您将不得不进行一些字符串到日期格式化。我强烈建议你改变以适当的方式存储日期。

首先为cont_details_id表中的每个depot_tracking选择最新日期,如下所示:

SELECT cont_details_id, MAX(date) AS latest
FROM depot_tracking
GROUP BY cont_details_id;

完成后,您可以使用date / cont_details_id将其连接回原始表,以获取所需的行:

SELECT d.depot_tracking_id, d.cont_details_id, d.date, c.cont_no
FROM depot_tracking d
JOIN(
  SELECT cont_details_id, MAX(date) AS latestDate
  FROM depot_tracking
  GROUP BY cont_details_id) tmp ON tmp.cont_details_id = d.cont_details_id AND tmp.latestDate = d.date
JOIN cont_details c ON c.cont_details_id = tmp.cont_details_id;

以下是SQL Fiddle示例,它会分别显示两个查询,以便您了解它们是如何组合在一起的。