2016-05-09 22 views
1

私は顧客ごとに複数の行を持つテーブルとvisit_dateを持っています。訪問日はnullでもかまいません。最大値でMySQLテーブルから行を選択する方法

私のテーブルは以下の通りです:

のお客様:

id | name  | email 
1 | John Doe1 | [email protected] 
2 | John Doe2 | [email protected] 
3 | John Doe3 | [email protected] 

store_customers

id | customer_id | store_id | email_optedin | visit_date 
1 |  1   | 1  | 1   | 2015-11-30 
2 |  1   | 2  | 1   | 2016-05-08 
3 |  1   | 3  | 1   | null 
4 |  2   | 1  | 1   | 2015-04-30 
5 |  2   | 2  | 1   | 2015-08-40 
6 |  2   | 3  | 1   | 2015-12-12 
7 |  3   | 1  | 1   | null 
8 |  3   | 2  | 1   | null 
9 |  3   | 3  | 1   | null 

私はどちらかが3のいずれかに訪問を持っていなかった顧客を取得しようとしています指定された日付以来訪問していない(例えば、2016-04-15)。

私は期待してい顧客2と3が、私はこのクエリを試していない1.

は:

select distinct * from customers 
inner join store_customers on store_customers.customer_id = customers.id 
    where customers.email != '' and 
    store_customer.store_id in (1,2,3) and customers.emailStatus not in ('Unverified','Bounced','Spammed') 
    and 
    (
     store_customer.email_optedin = 1 
     and max(store_customers.visit_date) <= '2016-04-15' 
     or account_customer.visit_date is null 
    ); 

これは動作しません。私は何らかの形で店頭IDのセットを取得する必要があります)、訪問しなかった(指定された店舗の訪問日にはすべてnull)か、訪問日が1つ以上あるかどうかを確認してから、最大指定された日付までの日付。

似たような質問がありましたが、答えが見つからなかったお客様や、少なくとも1人ではないお客様を選択してから、最新の訪問日を結合されたテーブルに格納されます。

私はこれをすべて1つのクエリで実行しようとしていますが、それが不可能な場合は、それを分解することもできます。また、このクエリには他にも多くのものが追加されており、結合の順序を変更することが問題になる可能性があるため、結合の順序を変更する必要はありません。

本当にありがとうございました。

よろしく、

Waqar

+0

を試してみてください私は、クエリは、顧客2と3 –

+0

を返すことを期待することを言及するのを忘れてしまった "またはaccount_customer.visit_dateはnullです" :そのテーブルはJOINの一部ではありません... – Webomatik

+0

申し訳ありません。 account_customerはタイプミスです。 store_customersである必要があります。 store_customerテーブルから、私はrow_6(customer_id2の場合)と7,8,9,9の行のうちの1つが同じcustomer_id(3)なので、期待しています。 –

答えて

0

は、このクエリ

SELECT 

     customers.id, 
     customers.name, 
     MAX(store_customers.visit_date) 

    FROM 

    customers LEFT JOIN store_customers on customers.id = store_customers.customer_id 

    GROUP BY customers.id,customers.name 

    HAVING MAX(store_customers.visit_date) < '2016-04-15' OR MAX(store_customers.visit_date) IS NULL 
関連する問題