我有两张表tbl_money
和tbl_cat
。
tbl_money
包含name
,cat_id
,price
。
tbl_cat
包含cat_id
,content
,date
,customer_id
。
注意:tbl_cat
中的每条记录都可以tbl_money
列cat_id
加入许多记录
我想从tbl_money
中选择具有相同price
,相同date
和相同customer_id
的记录。
我附上了真实数据的图像。 Click here to view
帮助我做的正确语法是什么。
谢谢!
答案 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)
请注意,如果您使用工作表而不是尝试在单个查询中执行此操作,则可能更好地提高性能。