从一个表中选择具有另一个表的条件的数据

时间:2016-11-25 07:23:10

标签: mysql syntax

我有两张表tbl_moneytbl_cat

tbl_money包含namecat_idprice

tbl_cat包含cat_idcontentdatecustomer_id

注意:tbl_cat中的每条记录都可以tbl_moneycat_id加入许多记录

我想从tbl_money中选择具有相同price,相同date和相同customer_id的记录。

我附上了真实数据的图像。 Click here to view

帮助我做的正确语法是什么。

谢谢!

1 个答案:

答案 0 :(得分:1)

drop table if exists tablea;
create table tablea(id int,catid varchar(6),acca int,accb int,price int);

drop table if exists tableb;
create table tableb(catid varchar(6),name varchar(7),customer varchar(6), dt date);

truncate tablea; truncate tableb;

insert into tablea values
(2,'Order5',111,131,40),(3,'Order1',131,511,40),(4,'Order2',131,511,40),(5,'Order3',111,131,30),(6,'Order3',133,131,10);

insert into tableb values
(1,'Order1','Apple','2016-11-02'),(2,'Order2','Apple','2016-11-11'),(3,'Order3','Apple','2016-11-11'),(4,'Order4','Google','2016-11-11');

此解决方案的第一步是创建一个虚拟密钥(k)并确定该行是父项还是子项

MariaDB [sandbox]> select a.*,
    -> case when a.acca = 131 then 1
    -> else 2
    -> end as ParentOrChild,
    -> case when a.acca = 131 then concat(131 , year(b.dt), month(b.dt),day(b.dt),b.customer)
    -> else concat(a.accb, year(b.dt), month(b.dt),day(b.dt),b.customer)
    -> end as k
    -> from tablea a
    -> join tableb b on b.name = a.catid;
+------+--------+------+------+-------+---------------+------------------+
| id   | catid  | acca | accb | price | ParentOrChild | k                |
+------+--------+------+------+-------+---------------+------------------+
|    3 | Order1 |  131 |  511 |    40 |             1 | 1312016112Apple  |
|    4 | Order2 |  131 |  511 |    40 |             1 | 13120161111Apple |
|    5 | Order3 |  111 |  131 |    30 |             2 | 13120161111Apple |
|    6 | Order3 |  133 |  131 |    10 |             2 | 13120161111Apple |
+------+--------+------+------+-------+---------------+------------------+
4 rows in set (0.00 sec)

如果总儿童价格与父母价格相匹配,那么下一阶段就会成功

MariaDB [sandbox]> select s.parentorchild, s.k,
    -> sum(case when s.parentorchild = 1 then s.price else 0 end ) -
    -> sum(case when s.parentorchild = 2 then s.price else 0 end ) MatchedPrice
    -> from
    -> (
    -> select a.*,
    -> case when a.acca = 131 then 1
    -> else 2
    -> end as ParentOrChild,
    -> case when a.acca = 131 then concat(131 , year(b.dt), month(b.dt),day(b.dt),b.customer)
    -> else concat(a.accb, year(b.dt), month(b.dt),day(b.dt),b.customer)
    -> end as k
    -> from tablea a
    -> join tableb b on b.name = a.catid
    -> ) s
    -> group by  s.k
    -> order by  s.k,s.parentorchild;
+---------------+------------------+--------------+
| ParentOrChild | k                | MatchedPrice |
+---------------+------------------+--------------+
|             1 | 13120161111Apple |            0 |
|             1 | 1312016112Apple  |           40 |
+---------------+------------------+--------------+
2 rows in set (0.00 sec)

我们现在知道我们感兴趣的虚拟键(k)(MatchedPrice = 0)所以如果我们加入虚拟键,我们就会得到我们感兴趣的行

ariaDB [sandbox]> select u.id,u.catid,u.customer,u.dt,u.acca,u.accb,u.price
    -> from
    -> (
    -> select s.parentorchild, s.k,
    -> sum(case when s.parentorchild = 1 then s.price else 0 end ) -
    -> sum(case when s.parentorchild = 2 then s.price else 0 end ) MatchedPrice
    -> from
    -> (
    -> select a.*,
    -> case when a.acca = 131 then 1
    -> else 2
    -> end as ParentOrChild,
    -> case when a.acca = 131 then concat(131 , year(b.dt), month(b.dt),day(b.dt),b.customer)
    -> else concat(a.accb, year(b.dt), month(b.dt),day(b.dt),b.customer)
    -> end as k
    -> from tablea a
    -> join tableb b on b.name = a.catid
    -> ) s
    -> group by  s.k
    -> order by  s.k,s.parentorchild
    -> ) t
    -> join
    -> (select a.*, b.customer,b.dt,
    -> case when a.acca = 131 then 1
    -> else 2
    -> end as ParentOrChild,
    -> case when a.acca = 131 then concat(131 , year(b.dt), month(b.dt),day(b.dt),b.customer)
    -> else concat(a.accb, year(b.dt), month(b.dt),day(b.dt),b.customer)
    -> end as k
    -> from tablea a
    -> join tableb b on b.name = a.catid
    -> ) u
    -> on u.k = t.k
    -> where MatchedPrice = 0
    -> ;
+------+--------+----------+------------+------+------+-------+
| id   | catid  | customer | dt         | acca | accb | price |
+------+--------+----------+------------+------+------+-------+
|    4 | Order2 | Apple    | 2016-11-11 |  131 |  511 |    40 |
|    5 | Order3 | Apple    | 2016-11-11 |  111 |  131 |    30 |
|    6 | Order3 | Apple    | 2016-11-11 |  133 |  131 |    10 |
+------+--------+----------+------------+------+------+-------+
3 rows in set (0.00 sec)

请注意,如果您使用工作表而不是尝试在单个查询中执行此操作,则可能更好地提高性能。