如何根据 Mysql 中的日期过滤重复的行?
how to filter repeated rows based on date in Mysql?
我有两个table
table 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 |
--------------------------------------------------
第二个table名字:cont_details
-----------------------------------
cont_no | cont_details_id |
-----------------------------------
aa | 1 |
bb | 2 |
cc | 3 |
dd | 4 |
ee | 5 |
ff | 6 |
gg | 7 |
--------------------------------------
现在我想合并这两个 table 并过滤重复的行,更重要的是我必须过滤具有旧日期的行。这正是我期待的输出
---------------------------------------------------------
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 格式日期
但不知道如何根据日期过滤重复的行
因为您的所有字段值都可以使用聚合函数可靠地确定,所以您只需要一个简单的聚合查询。
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'.
更新
由于您似乎无法使用损坏的日期格式 - 此查询将起作用:
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
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
首先,MySQL 不以 'dd-mm-yyyy' 格式存储日期,而是以 'yyyy-mm-dd' 格式存储日期。如果您使用的是 date
类型,则以下解决方案将起作用。如果不是,则必须对字符串进行日期格式化。不过,我强烈建议您更改为以正确的方式存储日期。
首先为 depot_tracking
table 中的每个 cont_details_id
选择最新日期,如下所示:
SELECT cont_details_id, MAX(date) AS latest
FROM depot_tracking
GROUP BY cont_details_id;
一旦你有了它,你可以使用 date/cont_details_id 将它连接回你原来的 tables 以获得你想要的行:
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 示例,它分别显示了两个查询,因此您可以看到它们是如何结合在一起的。
我有两个table
table 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 |
--------------------------------------------------
第二个table名字:cont_details
-----------------------------------
cont_no | cont_details_id |
-----------------------------------
aa | 1 |
bb | 2 |
cc | 3 |
dd | 4 |
ee | 5 |
ff | 6 |
gg | 7 |
--------------------------------------
现在我想合并这两个 table 并过滤重复的行,更重要的是我必须过滤具有旧日期的行。这正是我期待的输出
---------------------------------------------------------
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 格式日期
但不知道如何根据日期过滤重复的行
因为您的所有字段值都可以使用聚合函数可靠地确定,所以您只需要一个简单的聚合查询。
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'.
更新
由于您似乎无法使用损坏的日期格式 - 此查询将起作用:
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
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
首先,MySQL 不以 'dd-mm-yyyy' 格式存储日期,而是以 'yyyy-mm-dd' 格式存储日期。如果您使用的是 date
类型,则以下解决方案将起作用。如果不是,则必须对字符串进行日期格式化。不过,我强烈建议您更改为以正确的方式存储日期。
首先为 depot_tracking
table 中的每个 cont_details_id
选择最新日期,如下所示:
SELECT cont_details_id, MAX(date) AS latest
FROM depot_tracking
GROUP BY cont_details_id;
一旦你有了它,你可以使用 date/cont_details_id 将它连接回你原来的 tables 以获得你想要的行:
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 示例,它分别显示了两个查询,因此您可以看到它们是如何结合在一起的。