获取一个表中的所有记录以及第二个表的相对最后一个记录

时间:2018-02-16 15:10:34

标签: mysql sql

情况(简化):

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

1 个答案:

答案 0 :(得分:2)

您的子查询正在从MAX(d)中选择tableB,为id_deviceval选择未确定的值。在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