限制每个父亲的内部联接

时间:2018-04-19 12:35:00

标签: mysql sql performance

我有一个名为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对于每一个,换句话说,你可以说这是freguesias条款中每个where的当前天气。

我此时的查询是:

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排序

2 个答案:

答案 0 :(得分:2)

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

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)上的索引来提高效果。

答案 1 :(得分:1)

我已设置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 |