当字段中有尾随零时,使用联接的查询无法正常工作

Posted

技术标签:

【中文标题】当字段中有尾随零时,使用联接的查询无法正常工作【英文标题】:Query with join does not work correctly when there are trailing zeros in the field 【发布时间】:2021-01-02 19:39:53 【问题描述】:

我有一个更改日志表,我只想显示每个文档的最新条目。但是,当文档编号有两个尾随零时,查询不会正确执行。任何想法如何解决它?

示例表:

number changedatetime
1-050 2020-12-10
1-100 2020-12-10
1-123 2020-12-10
1-050 2020-12-15
1-100 2020-12-16
1-123 2020-12-17

查询示例:

SELECT mdt.* 
FROM change_log mdt 
    LEFT JOIN change_log bdt ON mdt.number = bdt.number 
        AND mdt.changedatetime < bdt.changedatetime 
WHERE bdt.changedatetime IS NULL 
AND mdt.document='$doctype' 
ORDER BY mdt.number ASC

我希望获得最近的类似列表:

number changedatetime
1-050 2020-12-15
1-100 2020-12-16
1-123 2020-12-17

但是,除非文档编号有两个尾随零,否则我将获取所有这些中的最新:

number changedatetime
1-050 2020-12-15
1-123 2020-12-17

文档编号的 SQL 数据库类型为“text”,changedatetime 为“timestamp”。

【问题讨论】:

可能值得一读***.com/questions/153633/natural-sort-in-mysql 它工作正常(没有您未发布任何数据的列document):db-fiddle.com/f/fP12xdLmNRgCwMdSh8yPxi/1 我在查询中看不到任何与可能以这种方式影响结果的数字相关的内容。您确定 document 和 changedatetime 符合条件吗? 那么document列的内容是什么? 【参考方案1】:

您的问题不完整,因为您在查询中引用了不在示例数据中的列。大概,你打算:

SELECT mdt.* 
FROM change_log mdt LEFT JOIN
     change_log bdt
     ON mdt.number = bdt.number AND
        mdt.document = bdt.document AND
        mdt.changedatetime < bdt.changedatetime 
WHERE bdt.changedatetime IS NULL AND
      mdt.document = ?
ORDER BY mdt.number ASC;

请注意,我将'$doctype' 替换为?,表示您应该将此值作为参数 传递,而不是用该值修改查询字符串。

我认为使用相关子查询的意图更加清晰:

select mdt.*
from change_log mdt
where mdt.changedatetime = (select max(bdt.changedatetime)
                            from change_log bdt
                            where mdt.number = bdt.number and
                                  mdt.document = bdt.document
                           ) and
      mdt.document = ?
order by mdt.number asc;

【讨论】:

以上是关于当字段中有尾随零时,使用联接的查询无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

Access 2013 中的联接查询

使用联接的 SQL Server 全文搜索无法按预期工作

无法使用简单的内部联接更新表

BigQuery 无法识别联接中子选择的字段

联接 SQL 查询未能填充下拉列表

计算类别中的所有有效产品;左联接无法正常工作