【问题标题】:Complicated SQL join query - get newest row复杂的 SQL 连接查询 - 获取最新行
【发布时间】:2012-01-27 01:48:01
【问题描述】:

我的 MySQL 数据库有一个包含 4 个字段的表 (cfg):id、name、data 和 location 这张表是为几个子域(位置)服务的。我需要获取给定子域(位置)的每个名称的最新行列表。

示例数据

id   name   data   location
---------------------------
1    color  red    dc
2    color  blue   dc
3    size   large  sj
4    color  green  sj
5    size   small  dc

以下查询运行良好,但似乎过于复杂和缓慢。有人有什么建议吗?

SELECT c1.name, c1.data
FROM (SELECT * FROM cfg WHERE location = "dc") as c1
LEFT JOIN (SELECT * FROM cfg WHERE location = "dc") as c2 ON ( c1.name = c2.name
AND c1.id < c2.id )
WHERE c2.id IS NULL

它会返回

name     data
--------------
color    blue
size     small

【问题讨论】:

    标签: mysql join subquery groupwise-maximum


    【解决方案1】:
    select name, data
    from cfg
    where id in (select max(id) from cfg where location = "dc" group by name)
    

    这只是未经测试的手绘,但我想你明白了。这假定列 id 是唯一的。

    【讨论】:

      【解决方案2】:

      我认为

      select c.name, c.data
      from cfg c
      join (
       select max(id) id
       from cfg
       group by name
       where location = 'dc'
      ) nameMaximums on nameMaximums.id = c.id 
      

      在 (location, name, id) 上使用一个索引,在 (id) 上使用一个索引

      【讨论】:

        【解决方案3】:

        使用带有GROUP BY 的子查询来计算最大值。 idname

        SELECT cfg.*
        FROM   cfg
        JOIN  (
            SELECT max(id) AS max_id
            FROM   cfg c0
            WHERE  location = 'dc'
            GROUP  BY name
            ) n ON n.max_id = cfg.id
        

        【讨论】:

          猜你喜欢
          • 2010-11-02
          • 2023-03-08
          • 1970-01-01
          • 2012-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-29
          • 1970-01-01
          相关资源
          最近更新 更多