我有一个名为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
排序
答案 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 |