2016-10-07 14 views
0

私は3つのテーブル:Order,PaymentおよびUserを持っています。MYSQL:特定のデータフィールドを持つユーザーのみを取得します

特定のお支払い方法(現金)を使用し、他のお支払い方法を使用していないユーザーのみを探しています。

は私が構築された単純なクエリは次のようになります。彼らは、少なくとも一回のお支払い方法として現金を使用した場合

select 
user.id, 
user.fname, 
user.lname, 
user.email 
from `order` as o 
inner join payments on o.id = payments.order_id 
inner join user on o.user_id = user.id 
where o.orderplaced_ts > "2016-08-01 00:00:00" 
and o.store_id = 6 
and o.order_status != "Cancelled" 
and payments.payment_method = "Cash" 
group by user.id 

はしかし、これは時間枠の間に、ユーザーが返されます。現金のみに限定するにはどうすればいいですか?

それぞれのお支払い方法に複数のサブクエリを使用する必要がありますか?各リターンと他を比較して、より多くのユーザーを排除する必要がありますか?

+0

また、http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very- simple-sql-query – Strawberry

+0

@Strawberry - 私はあなたの提案を感謝しますが、私は私に対処している手を扱います。 – Bardworx

+0

これは1回限りのクエリですか、それとも頻繁に実行されますか? – 2bigpigs

答えて

0

あなたは他の方法

select 
    user.id, 
    user.fname, 
    user.lname, 
    user.email 
    from `order` as o 
    inner join payments on o.id = payments.order_id 
    inner join user on o.user_id = user.id 
    where o.orderplaced_ts > "2016-08-01 00:00:00" 
    and o.store_id = 6 
    and o.order_status != "Cancelled" 
    and payments.payment_method = "Cash" 
    and user.id not in (select distinct o.user_id 
         from `order` 
         inner join payments on o.id = payments.order_id 
         where payments.payment_method <> "Cash") 
    group by user.id 
0

現金以外の支払い方法を使用している同じユーザーからの支払いを確認するための条件を追加することはできません。 のようないくつかのもの: -

select 
user.id, 
user.fname, 
user.lname, 
user.email 
from `order` as o 
inner join payments on o.id = payments.order_id 
inner join user on o.user_id = user.id 
where o.orderplaced_ts > "2016-08-01 00:00:00" 
and o.store_id = 6 
and o.order_status != "Cancelled" 
and payments.payment_method = "Cash" 
and not in (select 1 from payments pym where pym.orderid = o.id and o.id = user.id and pym.payment_method <> 'Cash') 
group by user.id 
0

を使用user.idに私はその内の他の支払の種類を持つユーザーを除外するために​​サブクエリを使用しないで使用することができます時間枠:

select 
user.id, 
user.fname, 
user.lname, 
user.email 
from `order` as o 
inner join payments on o.id = payments.order_id 
inner join user on o.user_id = user.id 
where o.orderplaced_ts > "2016-08-01 00:00:00" 
and o.store_id = 6 
and o.order_status != "Cancelled" 
and payments.payment_method = "Cash" 
and not exists (select 1 
       from `order` as o2 
       inner join payments p2 on o2.id = p2.order_id 
       where o2.orderplaced_ts > "2016-08-01 00:00:00" 
       and o2.store_id = 6 
       and o2.order_status != "Cancelled" 
       and p2.payment_method != "Cash" 
       and o2.user_id=user.id) 
group by user.id, user.fname, user.lname,user.email 

サブクエリを存在しないという利点は、それがサブクエリからの結果をプルする必要がないということであるサブクエリはRETならば、それだけでチェックurnすべてのレコード。

関連する問題