当字段中有尾随零时,使用联接的查询无法正常工作
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;
【讨论】:
以上是关于当字段中有尾随零时,使用联接的查询无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章