2016-11-25 96 views
-2

我有两个表tbl_moneytbl_cat从一个表中选择数据与另一个条件

tbl_money包含name,cat_idprice

tbl_cat包含cat_id,content, date,customer_id

注:从tbl_cat每个记录可以通过cat_id

我想选择tbl_money记录有相同price,同样date和同customer_id加入从tbl_money多条记录。

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

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

谢谢!

+1

您能否请您展示您到目前为止所尝试的内容,并找到有用的链接http://www.w3schools.com/sql/sql_join_left.asp – Veerendra

+1

提供您的样本数据和样本预期结果。 – Viki888

+1

分享您的查询和样品表数据 – AftabHafeez

回答

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) 

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

相关问题