2012-01-07 6 views
2

うまくいけば私の挑戦に簡単な解決があります。特定の親の最新の子行を選択

私は親テーブルを持っていますテーブル 'A'とテーブル 'B'という子テーブルを呼び出します。私は テーブル '' A 'の特定の行のテーブル' B 'の最新の行から情報を取得したいと思います。

たとえば、テーブル 'A'の親12345には、テーブル 'B'に3つの子ローがあります。行番号 3は、親12345のテーブル 'B'の最新の行です。3行目の の情報を取得したいと考えています。

私はいくつかのアプローチを試してみましたが、必要なことをすることができなかったので、ここに投稿しました。

ありがとうございます。

答えて

2

は、親の子IDを子IDによってそれらに関連する2つのテーブルに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をサポートします。

+0

助けてくれてありがとうジョナサン。 –

2

一度に1つのレコードでこれを行う場合は、@ 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値が順番になっていることを前提としていあなたは欲しい。これは当てはまらない可能性があり、「最新の」レコードを決定するために別のフィールドを使用する必要があります。このフィールドが各親に対して一意であるならば、同じアイデアはまだ機能します。 child_idが希望の順序ではなく、注文フィールドが一意ではない、これはたとえば、代わりに1の複数のレコードを与えることができ、同じdate_stamp値を持つ2人の子供

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 

。これは相関サブクエリで解決できますが、それは遅いですが...

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

あなたの助けをありがとうDems。 –

関連する問題