Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从一个表中获取所有记录,再加上第二个表的相对最后一条记录_Mysql_Sql - Fatal编程技术网

Mysql 从一个表中获取所有记录,再加上第二个表的相对最后一条记录

Mysql 从一个表中获取所有记录,再加上第二个表的相对最后一条记录,mysql,sql,Mysql,Sql,情况(简化): 表a id | id_device ----+---------- ... | 10 ... | 11 ... | 12 表B id | id_device | val ----+-----------+---- ... | 10 | 200 ... | 10 | 105 ... | 10 | 120 ... | 11 | 80 预期结果:来自表A的所有记录,对于表A的每条记录,表B上的最后一条相对记录 id_dev

情况(简化):

表a

id  | id_device
----+----------
... | 10
... | 11
... | 12
表B

id  | id_device | val
----+-----------+----
... | 10        | 200
... | 10        | 105
... | 10        | 120
... | 11        | 80
预期结果:来自
表A
的所有记录,对于
表A
的每条记录,
表B
上的最后一条相对记录

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

您的子查询正在从
表B
中选择
MAX(d)
,以及
id\u设备
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)
这允许您从
表B
中选择多个字段,但如果您只对
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

您的子查询正在从
表B
中选择
MAX(d)
,以及
id\u设备
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)
这允许您从
表B
中选择多个字段,但如果您只对
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

您需要从内部SQL(子查询或deliverd表)中更改使用MAX(id)的ON子句(首先将其别名为MAX_id)
在tableA.id_device=tableB.id_device和tableA.id=tableB.max_id
您不能正确获取最后一条记录是什么意思?您需要从内部SQL(子查询或deliverd表)更改使用max(id)(将其别名为max_id)的ON子句
在tableA.id_设备=tableB.id_设备和tableA.id=tableB.max_id
您不能正确获取最后一条记录是什么意思?这非常有效。我将使用第一个,我必须选择表b的几个字段。这非常有效。我将使用第一个,我必须选择表b的几个字段。