Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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_Parent Child - Fatal编程技术网

Mysql 为给定父级选择最近的子行

Mysql 为给定父级选择最近的子行,mysql,sql,parent-child,Mysql,Sql,Parent Child,希望我的挑战有一个简单的解决方案 我有一个父表,我称之为表“a”,还有一个子表,我称之为表“B”。我会的 是否希望从表“B”中最近的行中获取表中给定行的信息 “A” 例如。。。表“A”中的父12345在表“B”中有三个子行。行号 3是表“B”中父级12345的最近一行。我想要第三排的 信息 我尝试了很多不同的方法,但无法让它做需要的事情,因此我在这里发布了这篇文章 提前感谢。在这两个表上使用,通过子id将它们与父/母的子id关联: SELECT b.* FROM Table_B b INNER

希望我的挑战有一个简单的解决方案

我有一个父表,我称之为表“a”,还有一个子表,我称之为表“B”。我会的 是否希望从表“B”中最近的行中获取表中给定行的信息 “A”

例如。。。表“A”中的父12345在表“B”中有三个子行。行号 3是表“B”中父级12345的最近一行。我想要第三排的 信息

我尝试了很多不同的方法,但无法让它做需要的事情,因此我在这里发布了这篇文章

提前感谢。

在这两个表上使用,通过子id将它们与父/母的子id关联:

SELECT b.*
FROM Table_B b INNER JOIN Table_A a
ON b.id = a.Table_B_id 
WHERE a.id = 42
ORDER BY b.id DESC
LIMIT 1
我想建议:

SELECT * FROM Table_B WHERE id IN (
    SELECT Table_B_id FROM Table_A ORDER BY id DESC LIMIT 1
)

但MySQL显然不支持对内部选择的限制。

如果一次只对一条记录执行此操作,我会使用@JonathonReinhart的答案

如果您想对表
A
中的多条记录执行此操作,那么我将使用子查询的联接

SELECT
  *
FROM
  (SELECT parent_id, MAX(child_id) AS child_id FROM TableB GROUP BY parent_id) AS lookup
INNER JOIN
  TableB
    ON  TableB.parent_id = lookup.parent_id
    AND TableB.child_id  = lookup.child_id

这假设您的child_id值符合您想要的顺序。这可能不是真的,您需要使用另一个字段来确定“最新”记录。如果此字段对于每个家长都是唯一的,则相同的想法仍然有效

SELECT
  *
FROM
  (SELECT parent_id, MAX(date_stamp) AS date_stamp FROM TableB GROUP BY parent_id) AS lookup
INNER JOIN
  TableB
    ON  TableB.parent_id  = lookup.parent_id
    AND TableB.date_stamp = lookup.date_stamp
如果
子\u id
不是您想要的顺序,并且排序字段不是唯一的,则可以提供多条记录,而不是1条。例如,两个子项具有相同的
date\u stamp
值。这可以通过相关子查询来解决,不过速度较慢

SELECT
  *
FROM
  TableA
INNER JOIN
  TableB
    ON  TableB.parent_id = TableA.parent_id
    AND TableB.child_id  =
        (
          SELECT
            child_id
          FROM
            TableB
          WHERE
            parent_id = TableA.parent_id       -- This makes it correlated
          ORDER BY
            date_stamp DESC,
            child_id   DESC
          LIMIT
            1
        )

谢谢你的帮助,乔纳森。