情况(简化):
TABLEA
id | id_device
----+----------
... | 10
... | 11
... | 12
tableB的
id | id_device | val
----+-----------+----
... | 10 | 200
... | 10 | 105
... | 10 | 120
... | 11 | 80
预期结果:来自tableA
的所有记录,以及tableA
的每条记录,tableB
上的最后一条相对记录。
id_device | val
----------+-----
10 | 120
11 | 80
12 | null
我试过这样的事情,但是我无法正确地获得最后一条记录:
SELECT tableA.*,
tableB.*
FROM tableA
LEFT JOIN (
SELECT id_device,
val,
MAX(id)
FROM tableB
GROUP BY id_device
) AS tableB
ON tableA.id_device = tableB.id_device
答案 0 :(得分:2)
您的子查询正在从MAX(d)
中选择tableB
,为id_device
和val
选择未确定的值。在MAX(id)
时,它不会选择整个记录。为此,您需要选择MAX(id)
,然后根据它加入。您可以通过使用简单的降序来选择顶行:
SELECT tableA.id_device, tableB.val
FROM tableA
LEFT JOIN tableB ON tableB.id = (SELECT id
FROM tableB
WHERE tableA.id_device = tableB.id_device
ORDER BY id DESC
LIMIT 1)
这允许您从tableB
中选择多个字段,但如果您只对val
这样的单个字段感兴趣,也可以直接从子查询中选择它而不是加入它:
SELECT tableA.id_device, (SELECT val
FROM tableB
WHERE tableA.id_device = tableB.id_device
ORDER BY id DESC
LIMIT 1) AS val
FROM tableA