Выбор самой последней дочерней строки для данного родителя - PullRequest
2 голосов
/ 07 января 2012

надеюсь, у моей проблемы есть простое решение.

У меня есть родительская таблица, которую я назову таблицей 'A', и дочерняя таблица с именем table 'B'.Я хотел бы получить информацию из самой последней строки в таблице «B» для данной строки в таблице «A».

Например ... parent 12345 в таблице «A» имеет три дочерние строки в таблице'B'.Строка № 3 является самой последней строкой в ​​таблице «B» для родителя 12345. Я хотел бы получить информацию о строке 3.

Я пробовал довольно много разных подходов и не мог заставить ее делать то, что нужно,отсюда мое размещение здесь.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 07 января 2012

Если вы делаете это для одной записи за раз, я бы использовал ответ @ 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
        )
2 голосов
/ 07 января 2012

Используйте INNER JOIN в двух таблицах, связывая их по идентификатору потомка с идентификатором потомка родителя:

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 для внутреннего выбора.

...