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