希望對我的挑戰有一個簡單的解決方案。爲給定的父母選擇最近的子行
我有一個父表我將調用表'A'和一個名爲表'B'的子表。我想 喜歡從表'B'中的最近一行獲取表 'A'中給定行的信息。
例如...表'A'中的父級12345在表'B'中有三個子行。行號 3是表格'B'中父級12345的最新行。我想獲得行3的 信息。
我嘗試了很多不同的方法,無法完成所需的工作,因此我在此發佈。
預先感謝您。
希望對我的挑戰有一個簡單的解決方案。爲給定的父母選擇最近的子行
我有一個父表我將調用表'A'和一個名爲表'B'的子表。我想 喜歡從表'B'中的最近一行獲取表 'A'中給定行的信息。
例如...表'A'中的父級12345在表'B'中有三個子行。行號 3是表格'B'中父級12345的最新行。我想獲得行3的 信息。
我嘗試了很多不同的方法,無法完成所需的工作,因此我在此發佈。
預先感謝您。
使用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。
如果你一次只做一條記錄,我會用@ 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
)
感謝您的幫助。 – 2012-01-08 14:16:14
感謝您的幫助喬納森。 – 2012-01-08 14:14:44