2016-05-06 12 views
-1

は、私は、次の表を作成します。 MYSQLの特定の顧客を選択しますか?

create table customers 

(
     ID    varchar(9), 
     name   varchar(15), 

CONSTRAINT pk_id PRIMARY KEY (ID) 
); 


create table living_places 
(
     code  varchar(7), 
     ID  varchar(9), 

CONSTRAINT pk_code PRIMARY KEY (code) 
); 

create table policies 
(
     code_policy   varchar(7), 
     code_living_place  varchar(7), 

CONSTRAINT pk_code_policy PRIMARY KEY (code_policy) 
); 

create table bills 
(
     code   varchar(7), 
     code_policy varchar(7), 
     paid_out  boolean, 

CONSTRAINT pk_code_bill PRIMARY KEY (code) 
); 
I inserted the following dates: 

は、私は次の日付を挿入:

insert into customers(ID, name) 
values('fx1','Louis'); 
insert into customers(ID, name) 
values('fx2','Peter'); 
insert into customers(ID, name) 
values('fx3','Alice'); 

insert into living_places(code, ID) 
values('001','fx1'); 
insert into living_places(code, ID) 
values('002','fx2'); 
insert into living_places(code, ID) 
values('003','fx1'); 
insert into living_places(code, ID) 
values('004','fx3'); 

insert into policies(code_policy, code_living_place) 
values('p1','001'); 
insert into policies(code_policy, code_living_place) 
values('p2','002'); 
insert into policies(code_policy, code_living_place) 
values('p3','003'); 

insert into bills(code, code_policy, paid_out) 
values('b1','p1','1'); 
insert into bills(code, code_policy, paid_out) 
values('b2','p1','1'); 
insert into bills(code, code_policy, paid_out) 
values('b3','p2','0'); 
insert into bills(code, code_policy, paid_out) 
values('b4','p2','1'); 
insert into bills(code, code_policy, paid_out) 
values('b5','p3','0'); 
insert into bills(code, code_policy, paid_out) 
values('b6','p3','1'); 

質問です:支払ったすべてのポリシーを持っているそれらの人々を選択する方法。

私の問題は、「ルイー」には「p1」と「p3」の2つのポリシーがあり、「p1」は支払われますが、「p3」は支払われません。

マイクエリ:

select ID from living_places where code in (
select code from living_places where code in (
select code_living_place from policies where code_policy in (
select code_policy from bills where paid_out=1 and code_policy not in (
select code_policy from bills where paid_out=0)))); 

MySQLは私を返す:

+------+ 
| ID | 
+------+ 
| fx1 | 
+------+ 

はP.S: "ルイ" は有料のすべてのポリシーを持っていけません。たとえば、請求書 "b5"は支払われません。

+3

同じ質問を2回転載しないでください。あなたはすでに今日この質問をしており、答えがあります。 http://stackoverflow.com/questions/37080951/how-to-select-a-specific-customer既に作成した同じ質問を続行し、新しい投稿の先頭に戻って同じことを繰り返す必要はありません。これはレッドではありません。 – Dresden

+0

@Dresdenポストを繰り返し投稿して申し訳ありませんが、問題は他の人が読むと思っていました。もう一度やりません – Python241820

答えて

1

を:

SELECT x.name 
FROM 
(SELECT c.name, SUM(CASE WHEN b.paid_out THEN 0 ELSE 1 END) all_paid 
FROM customers c JOIN living_places l ON c.ID = l.ID 
JOIN policies p ON l.code = p.code_living_place 
JOIN bills b ON p.code_policy = b.code_policy 
GROUP BY c.name) x 
WHERE x.all_paid = 0; 

たぶん、あなたはここにHAVING句を使用してネストされたSELECTを避けることができまた...

0

私は、この使用して集約し、having句に近づくだろう:私はSUM-CASEのアプローチを好む

select p.id 
from policies p join 
    living_places lp 
    on p.code = lp.code_living_place join 
    bills b 
    on b.code_policy = p.code_policy 
group by p.id 
having sum(b.paid_out = 1) = count(*); 
関連する問題