2012-01-07 19 views
2

希望對我的挑戰有一個簡單的解決方案。爲給定的父母選擇最近的子行

我有一個父表我將調用表'A'和一個名爲表'B'的子表。我想 喜歡從表'B'中的最近一行獲取表 'A'中給定行的信息。

例如...表'A'中的父級12345在表'B'中有三個子行。行號 3是表格'B'中父級12345的最新行。我想獲得行3的 信息。

我嘗試了很多不同的方法,無法完成所需的工作,因此我在此發佈。

預先感謝您。

回答

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。

+0

感謝您的幫助喬納森。 – 2012-01-08 14:14:44

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 
     ) 
+0

感謝您的幫助。 – 2012-01-08 14:16:14