【问题标题】:Limit on inner join per parent每个父级的内部连接限制
【发布时间】:2018-04-19 12:34:59
【问题描述】:

我有一个名为weathers的表:

+--------+-------+---------+
| id     | temp  | id_freg |
+--------+-------+---------+
|    337 | 12.36 |       1 |
|   3556 | 11.46 |       2 |
|   6775 |  9.30 |       3 |
|  10210 |  8.55 |       1 |
|  13429 |  9.69 |       2 |

还有一张名为freguesias的表(葡萄牙的小地方):

+----+-----------+
| id | name      |
+----+-----------+
|  1 | Cabeção   |
|  2 | Pavia     |
|  3 | Brotas    |
|  4 | Mora      |

我需要从这里做一个 INNER 连接并限制每个 freguesia 的天气结果数量,所以如果我想要 3 个 freguesias 的天气,我想为每个 order desc limit 1你可以说这是where 子句中每个freguesias 的当前天气。

此时我的查询是:

select weathers.* 
from weathers 
inner join freguesias 
    ON weathers.id_freg = freguesias.id 
where weathers.id_freg IN (2,1) 
LIMIT 1;

这行不通,因为我需要每个结果一个:id_freg = 1 一个,id_freg = 2 另一个,每个由weathers.id DESC 排序

【问题讨论】:

  • 包含样本结果可能会使您的问题更清楚。

标签: mysql sql performance


【解决方案1】:

假设weathers.id 指定最近的值,那么您可以计算每个频率的最近值。在这种情况下,我会推荐一个相关的子查询:

select w.* 
from weathers w
where w.id_freg in (2, 1) and
      w.id = (select max(w2.id) 
              from weathers w2 
              where w2.id_freg = w.id_freg
             );

您希望在weathers(id_freq, id) 上建立索引以提高性能。

【讨论】:

  • 应该是 =>> select max(w2.id) from weathers w2 where w2.id_freg = w.id_freg
  • weathers w 是否与weathers as w 相同?
  • @HulaHula 。 . .是的。我总是将as 用于列别名,从不用于表别名。
【解决方案2】:

我设置了一个SQL Fiddle 来展示如何做到这一点。由于您实际上是在生成位置列表,因此我基于该表进行了查询,并加入了温度测量值。我假设您想要每个城市的最新(最后插入)行。

select * 
from freguesias f
join (
    SELECT w.id_freg,MAX(w.id) as id
    FROM weathers w
    GROUP BY w.id_freg
    ORDER BY w.id DESC) as wf
  ON wf.id_freg = f.id
JOIN weathers w1
  ON w1.id = wf.id

Results

| id |    name | id_freg |    id |    id | temp | id_freg |
|----|---------|---------|-------|-------|------|---------|
|  1 | Cabeção |       1 | 10210 | 10210 | 8.55 |       1 |
|  2 |   Pavia |       2 | 13429 | 13429 | 9.69 |       2 |
|  3 |  Brotas |       3 |  6775 |  6775 |  9.3 |       3 |

【讨论】:

  • 您的子查询中缺少 w.temp 列 ....您的查询仅适用于 mysql
  • 子查询不需要 temp,因为它只是用来识别温度表中的最新行。下一个连接获取温度。另外,这被标记为 MySQL,所以我提供了一个 MySQL 解决方案
猜你喜欢
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2011-07-04
  • 2016-05-03
  • 1970-01-01
  • 2011-02-08
  • 2014-05-17
  • 2018-12-25
相关资源
最近更新 更多