2012-02-02 10 views
1

1つのテーブル(テーブルA)から特定の行セットを選択し、別のテーブル(テーブルB)。これにより、表Aのレコードは1つだけ表示され、表Bの最新のレコードは日時列に基づいて結合されます。1つのテーブルから行を選択し、1対多の関係を持つ他のテーブルから最も近い行に参加する

例えば、テーブルAには、この構造(大きく簡略化を)持っている:

id | col_1  | col_2   
---+-----------+---------------- 
1 | something | something else 
2 | val_1  | val_2 
3 | stuff  | ting 
4 | goats  | sheep 

、表Bは次のようになります。私が望む何

id | fk_A  | datetime_col  | col_3 
---+-----------+---------------------+-------- 
1 | 1   | 2012-02-01 15:42:14 | Note 1 
2 | 1   | 2012-02-02 09:46:54 | Note 2 
3 | 1   | 2011-11-14 11:18:32 | Note 3 
4 | 2   | 2009-04-30 16:49:01 | Note 4 
5 | 4   | 2013-06-21 15:42:14 | Note 5 
6 | 4   | 2011-02-01 18:44:24 | Note 6 

は次のようになり、結果セットです:

id | col_1  | col_2   | datetime_col  | col_3 
---+-----------+----------------+---------------------+-------- 
1 | something | something else | 2012-02-02 09:46:54 | Note 2 
2 | val_1  | val_2   | 2009-04-30 16:49:01 | Note 4 
3 | stuff  | ting   | NULL    | NULL 
4 | goats  | sheep   | 2013-06-21 15:42:14 | Note 5 

このように、表Bは表Aと一緒にに結合されていますBからの最新の対応するレコードのみが結果に含まれています。

私はLEFT JOINSELECT DISTINCTの様々な組み合わせを試してみましたが、サブクエリと、私はちょうどそれが仕事を得ることができない、私はどちらかが全く結果や、このような何かを得るていない:と...

id | col_1  | col_2   | datetime_col  | col_3 
---+-----------+----------------+---------------------+-------- 
1 | something | something else | 2012-02-01 15:42:14 | Note 1 
1 | something | something else | 2012-02-02 09:46:54 | Note 2 
1 | something | something else | 2011-11-14 11:18:32 | Note 3 
2 | val_1  | val_2   | 2009-04-30 16:49:01 | Note 4 
3 | stuff  | ting   | NULL    | NULL 
4 | goats  | sheep   | 2013-06-21 15:42:14 | Note 5 
4 | goats  | sheep   | 2011-02-01 18:44:24 | Note 6 

をテーブルAからのレコードが繰り返される。

明らかに私のSQL-fuはこの作業には十分ではありませんので、親切な方が私に正しい方向を教えていただければ幸いです。私はかなりの数のグーグルを行っていますので、この特定のタスクに一致するものは見つかりませんでしたが、私は質問が以前に尋ねられたと確信していますが - 私はSQLキーワードが忘れている/私がそれを捜したら、私は即座に答えを見つけるだろう。

this question私は100%確信していませんが、受け入れられる回答にはSELECT TOPが含まれていますが、これはMySQLで有効ではないと考えました。

私の実際のクエリは、はるかに複雑であり、いくつかのテーブルを結合すると、それはこれがどのように行われるかに任意の違いを行った場合には、私はそれを示さなければならない:

SELECT `l` . * , `u`.`name` AS 'owner_name', `s`.`name` AS 'acquired_by_name', `d`.`type` AS `dtype` , `p`.`type` AS `ptype` 
FROM `leads` l 
LEFT JOIN `web_users` u ON `u`.`id` = `l`.`owner` 
LEFT JOIN `web_users` s ON `s`.`id` = `l`.`acquired_by` 
LEFT JOIN `deal_types` d ON `d`.`id` = `l`.`deal_type` 
LEFT JOIN `property_types` p ON `p`.`id` = `l`.`property_type` 

このクエリは、私が欲しいデータを連携し、返します(時々私はまたWHERE句を追加しますが、これは正常に動作します)が、私は今したいと思います:notesは「多くのレコード」を含んでおり、leadsは「一つのレコード」は関連するが含まれてい

LEFT JOIN `notes` n ON `n`.`lead_id` = `l`.`id` 

を...。

また、(別のクエリで)最も古いレコードを返すこともできますが、これはASC/DESCをどこかに簡単に反転させる簡単なケースになると思います。

答えて

4

私は、これはあなたを助けると思う:

SELECT A.id, A.col_1, A.col_2, A.datetime_col, A.col_3 
FROM 
    (SELECT B.id, B.col_1, B.col_2, C.datetime_col, C.col_3 
    FROM tableA B LEFT OUTER JOIN tableB C ON B.id = C.id 
    ORDER BY C.datetime_col desc) as A 
GROUP BY A.id 
+1

おかげで、これは多くのことを助けました。 – DaveRandom

+0

これは時間を節約しました、ありがとうございました!私があなたに2倍の票を投じることができたら、私はそうするだろう – haakym

関連する問題