如何编写一个sql语句来查找具有相同费用表的客户端?

时间:2014-05-05 02:17:11

标签: mysql sql join

让我们说房屋清洁公司有table fee_schedule,其中列出了每种任务的收费标准。

create table fee_schedule (
  clientId int, 
  feeType int,
  feeAmount int,  /*dollars*/
  primary key (clientId, feeType)
);

以下是费用:

Client 1 (Google)
    feeType 1 (Window Cleaning)  $10 (per each window)
    feeType 2 (Carpet Cleaning)  $20 (per room)
    feeType 3 (Emptying trashcans)  $30 (per trash can)
    feeType 4 (Dusting)  $40 (per room)

Client 2 (Facebook)
    feeType 1 (Window Cleaning)  $10 (per each window)
    feeType 2 (Carpet Cleaning)  $20 (per room)
    feeType 3 (Emptying trashcans)  $31 (per trash can)
    feeType 4 (Dusting)  $41 (per room)

Client 3 (Apple)
    feeType 1 (Window Cleaning)  $12 (per each window)
    feeType 2 (Carpet Cleaning)  $22 (per room)
    feeType 3 (Emptying trashcans)  $32 (per trash can)
    feeType 4 (Dusting)  $42 (per room)

Client 4 (Twitter)
    feeType 1 (Window Cleaning)  $10 (per each window)
    feeType 2 (Carpet Cleaning)  $20 (per room)
    feeType 3 (Emptying trashcans)  $30 (per trash can)
    feeType 4 (Dusting)  $40 (per room)

以下是示例数据:

insert into fee_schedule values (1, 1, 10);
insert into fee_schedule values (1, 2, 20);
insert into fee_schedule values (1, 3, 30);
insert into fee_schedule values (1, 4, 40);

insert into fee_schedule values (2, 1, 10);
insert into fee_schedule values (2, 2, 20);
insert into fee_schedule values (2, 3, 31);
insert into fee_schedule values (2, 4, 41);

insert into fee_schedule values (3, 1, 12);
insert into fee_schedule values (3, 2, 22);
insert into fee_schedule values (3, 3, 32);
insert into fee_schedule values (3, 4, 42);

insert into fee_schedule values (4, 1, 10);
insert into fee_schedule values (4, 2, 20);
insert into fee_schedule values (4, 3, 30);
insert into fee_schedule values (4, 4, 40);

我写了一个查询,以获取哪些客户与客户#1,Google具有相同确切费用表的列表。

select distinct f2.clientId
from fee_schedule f
join fee_schedule f2 on f.feeType=f2.feeType and f.feeAmount=f2.feeAmount
where f.clientId<f2.clientId

查询返回客户端2和4,但不应返回客户端2,因为其费用仅部分相同。如何编辑此查询以仅在所有费用匹配时返回结果?

1 个答案:

答案 0 :(得分:1)

您可以使用group byhaving子句计算匹配数量来执行此操作:

select f.clientId
from fee_schedule f left join
     fee_schedule fg
     on f.feeType = fg.feeType and f.feeAmount = fg.feeAmount and fg.clientid = 1
group by f.clientid
having count(*) = (select count(*) from fee_schedule f where f.clientid = 1) and
       count(fg.clientid) = count(*);

编辑:

在MySQL中,您也可以使用group_concat()

执行此操作
select f.client_id
from fee_schedule f
group by f.client_id
having group_concat(fee_type, ':', fee_amount order by fee_type, fee_amount) =
       (select group_concat(fee_type, ':', fee_amount order by fee_type, fee_amount) as fees
        from fee_schedule
        where client_id = 1
       );

Here是一个带有两个查询的SQL小提琴。