我如何将来自 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_datadeposit_datatransaction_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');
SELECT 
    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
客户 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 日:100

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 个外键的表中?

如何在 SQL 中显示来自 3 个不同表的多个列?

在sql中组合来自不同表的数据

使用来自 2 个不同表的字段创建表

Microsoft Access - 具有来自不同表的多个条件的 Dlookup

访问具有最新日期的 SQL 唯一记录,包括来自单个表的空日期