【问题标题】:JOIN Call table to grouping by Origination and Destination加入呼叫表以按起点和终点分组
【发布时间】:2019-03-03 17:04:38
【问题描述】:

这是一个呼叫系统。

表格结构和数据样本:

tbl_countries

CREATE TABLE tbl_countries
(
    country_id int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    country varchar(100) NOT NULL
);
INSERT INTO tbl_countries (country) VALUES ('Austria');
INSERT INTO tbl_countries (country) VALUES ('Brazil');
INSERT INTO tbl_countries (country) VALUES ('Denmark');
INSERT INTO tbl_countries (country) VALUES ('France');
INSERT INTO tbl_countries (country) VALUES ('Lebanon');

tbl_destination_clients

CREATE TABLE tbl_destination_clients
(
    des_client_id int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    des_client varchar(100) NOT NULL,
    country_id int(11) NOT NULL,
    CONSTRAINT tbl_destination_clients_ibfk_1 FOREIGN KEY (country_id) REFERENCES tbl_countries (country_id)
);
CREATE INDEX country_id ON tbl_destination_clients (country_id);
INSERT INTO tbl_destination_clients (des_client, country_id) VALUES ('961123456', 5);
INSERT INTO tbl_destination_clients (des_client, country_id) VALUES ('55123456', 2);
INSERT INTO tbl_destination_clients (des_client, country_id) VALUES ('45123456', 3);

tbl_origination_clients

CREATE TABLE tbl_origination_clients
(
    orig_client_id int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    orig_client varchar(100) NOT NULL,
    country_id int(11) NOT NULL,
    CONSTRAINT tbl_origination_clients_ibfk_1 FOREIGN KEY (country_id) REFERENCES tbl_countries (country_id)
);
CREATE INDEX country_id ON tbl_origination_clients (country_id);
INSERT INTO tbl_origination_clients (orig_client, country_id) VALUES ('33123456', 4);
INSERT INTO tbl_origination_clients (orig_client, country_id) VALUES ('43123456', 1);

tbl_calls

CREATE TABLE tbl_calls
(
    call_id int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
    orig_client_id int(11) NOT NULL,
    des_client_id int(11) NOT NULL,
    call_duration int(11) NOT NULL,
    CONSTRAINT tbl_calls_ibfk_1 FOREIGN KEY (orig_client_id) REFERENCES tbl_origination_clients (orig_client_id),
    CONSTRAINT tbl_calls_ibfk_2 FOREIGN KEY (des_client_id) REFERENCES tbl_destination_clients (des_client_id)
);
CREATE INDEX des_client_id ON tbl_calls (des_client_id);
CREATE INDEX orig_client_id ON tbl_calls (orig_client_id);
INSERT INTO tbl_calls (orig_client_id, des_client_id, call_duration) VALUES (1, 3, 5);
INSERT INTO tbl_calls (orig_client_id, des_client_id, call_duration) VALUES (1, 3, 6);
INSERT INTO tbl_calls (orig_client_id, des_client_id, call_duration) VALUES (2, 4, 9);
INSERT INTO tbl_calls (orig_client_id, des_client_id, call_duration) VALUES (1, 1, 10);

尝试:

我尝试在同一张表tbl_calls之间使用JOIN,但它不起作用;(

但是这个样本数据的结果必须是:

Origination  Destination  SUM(call_duration)
------------+------------+----------------
France       Brazil       11 -> (5+6)
Austria      Denmark      9
France       Lebanon      10

谢谢@forpas

使用自适应连接列进行查询

select
  co.country Origination,
  cd.country Destination,
  sum(c.call_duration) TotalDuration
from tbl_calls c 
inner join tbl_destination_clients d on d.des_client_id = c.des_client_id
inner join tbl_origination_clients o on o.orig_client_id = c.orig_client_id
inner join tbl_countries cd on cd.country_id = d.country_id
inner join tbl_countries co on co.country_id = o.country_id
group by   
  co.country,
  cd.country;

【问题讨论】:

  • “我想” 不是提问的方式。请向我们展示 1) 您的尝试 2) 表结构 作为文本 3) 数据样本 4) 预期输出
  • 谢谢@Cid,新的解释好吗?

标签: php mysql sql database join


【解决方案1】:

在多次加入后进行分组(tbl_countries 必须为目的地和始发地加入两次)
并总结call_duration:

select
  co.country Origination,
  cd.country Destination,
  sum(c.call_duration) TotalDuration
from tbl_calls c 
inner join tbl_destination_clients d on d.des_client_id = c.des_client_id
inner join tbl_origination_clients o on o.orig_client_id = c.des_client_id
inner join tbl_countries cd on cd.country_id = d.country_id
inner join tbl_countries co on co.country_id = o.country_id
group by   
  co.country,
  cd.country;

【讨论】:

  • 您发布的示例数据未产生预期结果。您插入到 tbl_calls 中的值 (1, 3, 5) 和 (1, 3, 6) 指向 tbl_origination_clients 中的 ('33123456', 4) 和 tbl_destination_clients 中的 ('45123456', 3),表示国家 4 和 3它们是:法国和丹麦,而不是法国和巴西。
  • 在这些来自 tbl_calls (2, 4, 9) 的值中,4 用于 des_client_id,但在 tbl_destination_clients 中没有 des_client_id = 4。
猜你喜欢
  • 2023-03-14
  • 2013-08-10
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多