【问题标题】:select the max value of varchar in MySQL在 MySQL 中选择 varchar 的最大值
【发布时间】:2016-02-16 13:50:09
【问题描述】:

我有一个员工表和描述表,如下所示。

员工表:

empId    empName
================
 1       foo
 2       bar

说明表:

id  description empId
======================
1   test A      1
2   test B      1
3   test C      1
4   test D      2
5   test E      2
6   test F      1

我可以加入并使用某事查询获取每个员工的最新描述,

select e.empId, e.empName, d.description
from employee e
inner join description d on d.id=(select max(id) from description where empId=e.empId)

这将返回所需的结果

empId        empName    description
===================================
1            foo        test F
2            bar        test E

但我想知道有没有其他方法可以在没有子查询的情况下获得相同的结果。

【问题讨论】:

  • 根据手册中的章节,您可以在没有子查询的情况下执行此操作,但未关联的子查询解决方案几乎肯定会更快

标签: mysql join subquery max


【解决方案1】:
SELECT DISTINCT e.empId, e.empName, d.description
FROM employee e
JOIN description d USING (empId)
join (
    SELECT MAX(d.id) as id
    FROM description d
    GROUP BY d.empId
) AS maxd ON maxd.id = d.id

【讨论】:

    【解决方案2】:

    可以完成涉及 GROUP BY 的解决方案,尽管它涉及将原始查询包装在另一个选择中。它避免了选择最大id的查询。

    SELECT * FROM (
    SELECT e.empId, e.empName, d.description
     FROM employee e
     JOIN description d USING (empId)
     ORDER BY e.empId ASC, d.id DESC
    ) tmp GROUP BY empId
    

    您的原始查询可以使用主键执行,其中这个查询涉及临时表和可能的文件排序,因此它可能没有那么高性能。

    【讨论】:

    • 这是一个未记录的解决方案,如果您愿意,可以称为“hack”。但是,嘿,黑客可以很有趣。
    【解决方案3】:

    我认为没有子查询你不能做到这一点,但你可以重写为:

    select e.empId,
           e.empName,
           (select description from description 
            where empId = e.empId 
            order by id desc limit 1) as description
    from employee e
    

    【讨论】:

    • 是的.. 但是要合并的表超过五个,所以我猜联接查询对于更高的性能更好
    • 在您的问题中,您有 2 张桌子。我怎么知道有 5 张桌子。您应该运行这两个查询,看看哪个更好。除非您同时测量两者,否则没有人会告诉您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多