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

时间:2012-01-07 01:59:09

标签: mysql sql parent-child

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

我有一个父表我将调用表'A'和一个名为表'B'的子表。我会 喜欢从表'B'中最近一行获取表中给定行的信息 'A'。

例如......表'A'中的父12345在表'B'中有三个子行。行号 3是父级12345的表'B'中最近的一行。我想得到第3行 信息。

我尝试了很多不同的方法,无法让它去做所需的事情,因此我在这里张贴。

提前谢谢。

2 个答案:

答案 0 :(得分:2)

在两个表上使用INNER JOIN,将子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在内部选择上不支持LIMIT。

答案 1 :(得分:2)

如果您一次只为一条记录执行此操作,我会使用@ 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

如果child_id不是您想要的顺序,并且排序字段不是唯一的,则可以提供多个记录而不是1.例如,两个具有相同date_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
        )