2016-06-21 5 views
0

私は顧客と契約の2つのテーブルを持っています。それらの共通鍵はcustomer_idです。架空のビジネスが顧客と契約しているかどうかを表すために、これら2つの表をリンクする必要があります。MAXの日付と顧客IDに基づいてデータを取得します

顧客 - >契約テーブルには1対多の関係があり、顧客は過去の契約を記録することができます。私は最新のものが欲しい。これは現在、自動的にインクリメントされるcontract_idによって処理されます。

私のクエリは、customer_idとそのcustomer_idのmax contract_idに基づいて契約データを取得することになっています。

私のクエリは、現在、次のようになります。

SELECT * FROM(
    SELECT co.* 
     FROM contracts co 
     LEFT JOIN customers c ON co.customer_id = c.customer_id 
     WHERE co.customer_id ='135') a 
    where a.contract_id = MAX(a.contract_id); 

答えはおそらく途方もなく明らかであると私はちょうどそれを見ていませんよ。

+1

この2つの簡単な手順を実行することをお勧めします。1.まだ実行していない場合は、適切なCREATE文とINSERT文(および/またはsqlfiddle)を指定して、問題をより簡単に再現できるようにします。 2.まだ実行していない場合は、手順1で提供された情報に対応する望ましい結果セットを提供してください。 – Strawberry

+1

dmcoding、私はあなたが 'LEFT JOIN'を逆転させたと思います。 「顧客LEFT JOIN契約」でなければならず、それは関係が0から多く... 1から多くではないことを意味します。 –

答えて

1

最新の契約は、単にORDER BYLIMIT 1

SELECT * FROM(
    SELECT co.* 
     FROM contracts co 
     LEFT JOIN customers c ON co.customer_id = c.customer_id 
     WHERE co.customer_id ='135') a 
ORDER BY a.contract_id DESC 
LIMIT 1 
+0

これは1レコードになります。もし 'WHERE'を削除しても動作しません。 – sagi

+0

私は間違っていました。あなたが既にuser_idでフィルタリングしているからです。これはうまくいくはずです。しかし、外部の 'SELECT * FROM'を削除してください –

+0

@sagi、なぜwouldntは動作しますか?私はまず質問を間違って読んだ。しかしOPのように見えるのは1つのレコードだけです –

1

、最高a.contract_idとのいずれかになりますので、あなたはNOT EXISTS()を使用することができます。

SELECT * FROM contracts c 
LEFT JOIN customers co 
ON(co.customer_id = c.customer_id) 
WHERE co.customer_id = '135' 
AND NOT EXISTS(SELECT 1 FROM contracts co2 
       WHERE co2.customer_id = co.customer_id 
        AND co2.contract_id > co.contract_id) 

これは、それが最新の契約だことを確認します、それはすべての顧客のための動的です、あなたは単にWHERE co.customer_id = '135'を削除することができ、あなたはすべての結果を得るでしょう。

一般に、GROUP BY句と通常組み合わされるHAVING()でのみ、WHERE句に集約関数を使用することはできません。

関連する問題