我如何将来自 3 个具有唯一 ID 的不同表的结果组合到 mysql 中
Posted
技术标签:
【中文标题】我如何将来自 3 个具有唯一 ID 的不同表的结果组合到 mysql 中【英文标题】:how do i combine results in mysql from 3 different tables with unique id 【发布时间】:2020-08-28 21:07:40 【问题描述】:这是我有 3 张桌子的情况,可以说
cust_data
,deposit_data
,transaction_info
:
在 cust_data 我有名字、姓氏、电子邮件、电话、客户 ID
在 deposit_data 我有 deposit_id, deposit_data,date,amount
在 transaction_info 我有 customer_id、deposit_id、email、transaction_date、processor
现在我需要列出客户的所有信息以及他所做的所有存款,例如:
cust_info : (Firstname, Lastname, Email ,Phone, customer_id)
1) John , smith , johnsmith@bla.com, 11111111, 111-111-111
2) Sara , sugar , sarasugar@lala.com, 22222222, 222-222-222
Deposit_data: (deposit_id, deposit_data,date,amount)
1) 187823 , " some processing info card number...." , 10/10/2019 , 100
2) 908202 , " some processing info card number...." , 11/11/2019 , 90
3) 323243 , " some processing info card number...." , 12/12/2019 , 100
transaction_info: (customer_id,deposit_id, email, transaction_date,processor)
1) 111-111-111 , 908202 , johnsmith@bla.com , 11/11/2019 , googlepay
2) 111-111-111 , 187823 , johnsmith@bla.com , 10/10/2019 , visa
3) 222-222-222 , 323243 , sarasugar@lala.com, 12/12/2019 , visa
现在我想进行 1 个查询,向我显示客户进行的所有存款,因此结果将如下所示:
customer_id,Firstname, Lastname, Email ,Phone, amount(bydate) :
111-111-111 John , smith , johnsmith@bla.com ,11111111 , (10/10/2019 : 100 | 10/10/2019 : 90)
如果我能把所有东西都放在同一个语句中就更好了,我只是不知道如何将所有 3 结合起来。
【问题讨论】:
【参考方案1】:GROUP BY GROUP_CONCAT INNER JOIN,给你答案 日期应始终以 mysql 格式保存,否则,当您必须使用函数时,您必须始终转换它们
CREATE TABLE cust_info ( `Firstname` VARCHAR(4), `Lastname` VARCHAR(5), `Email` VARCHAR(18), `Phone` INTEGER, `customer_id` VARCHAR(11) ); INSERT INTO cust_info (`Firstname`, `Lastname`, `Email`, `Phone`, `customer_id`) VALUES ('John', 'smith', 'johnsmith@bla.com', '11111111', '111-111-111'), ('Sara', 'sugar', 'sarasugar@lala.com', '22222222', '222-222-222');
CREATE TABLE Deposit_data ( `deposit_id` INTEGER, `deposit_data` VARCHAR(39), `date` VARCHAR(10), `amount` INTEGER );
INSERT INTO Deposit_data (`deposit_id`, `deposit_data`, `date`, `amount`) VALUES ('187823', ' some processing info card number....', '10/10/2019', '100'), ('908202', ' some processing info card number....', '11/11/2019', '90'), ('323243', ' some processing info card number....', '12/12/2019', '100');
CREATE TABLE transaction_info ( `customer_id` VARCHAR(11), `deposit_id` INTEGER, `email` VARCHAR(18), `transaction_date` varchar(10), `processor` VARCHAR(9) );
INSERT INTO transaction_info (`customer_id`, `deposit_id`, `email`, `transaction_date`, `processor`) VALUES ('111-111-111', '908202', 'johnsmith@bla.com', '11/11/2019', 'googlepay'), ('111-111-111', '187823', 'johnsmith@bla.com', '10/10/2019', 'visa'), ('222-222-222', '323243', 'sarasugar@lala.com', '12/12/2019', 'visa');
客户 ID |名字 |姓氏 |电子邮件 |电话 |金额(截止日期) :------------ | :-------- | :------- | :----------------- | --------: | :-------------------------------- 111-111-111 |约翰 |史密斯 | johnsmith@bla.com | 11111111 | 2019 年 10 月 10 日:100 | 2019 年 11 月 11 日:90 222-222-222 |萨拉 |糖| sarasugar@lala.com | 22222222 | 2019 年 12 月 12 日:100SELECT ci.customer_id, ci.Firstname, ci.Lastname, ci.Email, ci.Phone , group_concat( dd.date, ' : ', dd.amount order by dd.date separator ' | ') 'amount(bydate)' FROM cust_info ci INNER JOIN transaction_info ti ON ti.customer_id = ci.customer_id INNER JOIN Deposit_data dd ON dd.deposit_id = ti.deposit_id GROUP BY ci.customer_id , ci.Firstname , ci.Lastname , ci.Email , ci.Phone
db小提琴here
【讨论】:
【参考方案2】:您可以使用字符串聚合。相关子查询可能比连接和外部聚合更有效:
select
c.*,
(
select group_concat(
d.date, ' : ', d.amount
order by d.date
separator ' | '
from transaction_info t
inner join deposit_data d on d.deposit_id = t.deposit_id
where t.customer_id = c.customer_id
)
from cust_info c
如果需要,您可以在外部查询中添加 where
子句以过滤给定的客户。
【讨论】:
【参考方案3】:您可以使用下一个查询作为解决方案:
select
ci.customer_id,
Firstname,
Lastname,
ci.Email,
Phone,
group_concat(CONCAT(dd.date, ' : ', dd.amount)SEPARATOR ' | ') deposit
from cust_info ci
left join transaction_info ti on ci.customer_id = ti.customer_id
join Deposit_data dd on dd.deposit_id = ti.deposit_id
group by ci.customer_id, Firstname, Lastname, ci.Email, Phone
;
这里可以看working example
【讨论】:
【参考方案4】:您需要一个内部连接选择语句。
SELECT * FROM cust_info c INNER JOIN transaction_info t ON c.cusomter_id = t.customer_id INNER JOIN deposit_data d ON d.deposit_id = t.deposit_id
应该没问题
【讨论】:
以上是关于我如何将来自 3 个具有唯一 ID 的不同表的结果组合到 mysql 中的主要内容,如果未能解决你的问题,请参考以下文章
休眠。如何将条目添加到具有来自 Hibernate 中 2 个不同表的 2 个外键的表中?