【问题标题】:MySQL remove duplicate issueMySQL删除重复问题
【发布时间】:2014-02-12 21:36:46
【问题描述】:

这是交易。

我的数据库表有很多列。这 4 个是我特别要关注的:

BOL_NUMBER, CONTAINER_NUMBER, WORKFLOW, WORKFLOW_DATESTAMP

一个 BOL_NUMBER 可能有多个 CONTAINER_NUMBER,具有不同的 WORKFLOW(一个 CONTAINER_NUMBER 只能有一个 BOL_NUMBER)。每次更新 CONTAINER_NUMBER 的 WORKFLOW 时,WORKFLOW_DATESTAMP 使用 MySQL 语法 NOW() 记录它的更新日期和时间。

当用户搜索 BOL_NUMBER(我的测试 BOL_NUMBER 是 AAAA111111)时,该表返回 3 个 BOL_NUMBER,所有这些都包含 3 个不同的 CONTAINER_NUMBER。

当前搜索返回此数据:

 BOL_NUMBER     CONTAINER_NUMBER     WORKFLOW     WORKFLOW_DATESTAMP
 AAAA111111     TRLU1234567          UNASSIGNED   2014-01-21 12:00  
 AAAA111111     MAXU7894561          UNASSIGNED   2014-01-21 12:00
 AAAA111111     CMAU6543217          UNASSIGNED   2014-01-21 12:00

此时,当 CONTAINER_NUMBER 的条件正确时,用户可以将 WORKFLOW 更新为 FULLY DISPATCHED。对于这种情况,我将使用 CONTAINER_NUMBER TRLU1234567。

当 CONTAINER_NUMBER 已更新时,用户可以执行另一次搜索以验证 WORKFLOW 是否确实已更新。

这是 CONTAINER_NUMBER TRLU1234567 更新后的搜索结果:

 BOL_NUMBER     CONTAINER_NUMBER     WORKFLOW          WORKFLOW_DATESTAMP
 AAAA111111     TRLU1234567          UNASSIGNED        2014-01-21 12:00 
 AAAA111111     TRLU1234567          FULLY DISPATCHED  2014-01-23 02:00 
 AAAA111111     MAXU7894561          UNASSIGNED        2014-01-21 12:00
 AAAA111111     CMAU6543217          UNASSIGNED        2014-01-21 12:00

正如您在上面的示例中看到的,现在有 2 个 CONTAINER_NUMBER TRLU1234567 实例。 请注意:这样做的原因是跟踪 WORKFLOW 的更新时间

话虽如此,我不想退回重复的 CONTAINER_NUMBER。我只想显示最近的 WORKFLOW_DATESTAMP。

基本上,当用户搜索 BOL_NUMBER AAAA111111 时,它应该只返回以下内容:

 BOL_NUMBER     CONTAINER_NUMBER     WORKFLOW         WORKFLOW_DATESTAMP
 AAAA111111     TRLU1234567          FULLY DISPATCHED 2014-01-23 02:00  
 AAAA111111     MAXU7894561          UNASSIGNED       2014-01-21 12:00
 AAAA111111     CMAU6543217          UNASSIGNED       2014-01-21 12:00   

数据库表将有 4 个 BOL_NUMBER AAAA111111 实例,但仅显示 3 个,如上所示,基于 WORKFLOW_DATESTAMP。

我希望我在这里很清楚。

这是我一直在尝试使用的代码:

  SELECT DISTINCT
    BOL_NUMBER,
    CONTAINER_NUMBER,
    WORKFLOW,
    MAX(WORKFLOW_DATESTAMP)
  FROM
    main_table
  WHERE
    BOL_NUMBER = 'AAAA111111'
  GROUP BY 
    BOL_NUMBER, CONTAINER_NUMBER;

但是当我使用上面的代码时,我只返回原始的 3 个 CONTAINER_NUMBER 和未分配的工作流。即使数据库表有 4 个 BOL_NUMBER 实例。

我从 SELECT 语句中取出了 DISTINCT,但这给了我相同的结果。

当我删除 GROUP BY 子句时,它只返回 1 条具有最新 WORKFLOW_DATESTAMP 的记录,但在 WORKFLOW 列中显示 UNASSIGNED。

我希望我在这里很清楚。基本上,如果用户搜索 BOL_NUMBER,代码将检查重复的 CONTAINER_NUMBER,检查哪个具有最新的 WORKFLOW_DATESTAMP,并显示该记录以及其他不重复的记录。

我认为我没有比这更清楚的了。

请帮忙。

提前谢谢你。

【问题讨论】:

  • 这张表有唯一的键吗?

标签: mysql select duplicates


【解决方案1】:

为此,我会使用substring_index()/group_concat() 方法来获取最新的工作流程:

SELECT BOL_NUMBER, CONTAINER_NUMBER,
       substring_index(group_concat(WORKFLOW order by WORKFLOW_DATESTAMP desc), ',', 1) as WORKFLOW,
       MAX(WORKFLOW_DATESTAMP)
FROM main_table
WHERE BOL_NUMBER = 'AAAA111111'
GROUP BY BOL_NUMBER, CONTAINER_NUMBER;

另外,当您使用group by 时,通常不需要distinct

【讨论】:

  • 谢谢。这行得通。然而,另一个问题出现了。但是您提供的代码有效。
【解决方案2】:

为什么不向数据库添加一个名为“LAST_MODIFIED”的列,并在更新记录时更新该日期时间。这将使您知道它何时更新,并且无需单独的条目。

【讨论】:

    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多