首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySql列表直接和间接子记录

MySql列表直接和间接子记录
EN

Stack Overflow用户
提问于 2018-11-06 09:33:15
回答 2查看 107关注 0票数 0

我有一个处理传输项的3个表DB模式。传输可以包含多个框和多个项。除此之外,一个盒子也可以包含多个项目。因此,一个项目可以直接或间接地附加到运输。

简化的DDL是:

代码语言:javascript
运行
复制
CREATE TABLE transport (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `transport_number` varchar(50) NOT NULL,
  `transport_date` datetime NOT NULL
)

CREATE TABLE box (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(50) NOT NULL,
  `transport_id` int(11) NOT NULL
)

CREATE TABLE item (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(50) DEFAULT NULL,
  `box_id` int(11) DEFAULT NULL,
  `transport_id` int(11) DEFAULT NULL
)

我尝试实现一个查询,该查询使用框和项目计数选择所有传输。就像这样:

预期结果:

代码语言:javascript
运行
复制
TRANSPORT_ID | TRANSPORT_NUMBER | BOX_COUNT | ITEM_COUNT
--------------------------------------------------------
1            | T1               | 2         | 3
2            | T2               | 1         | 2

样本数据

运输:

代码语言:javascript
运行
复制
ID     | TRANSPORT_NUMBER | TRANSPORT_DATE
------------------------------------------
1      | T1               | 2018-11-06
2      | T2               | 2018-11-06

方框:

代码语言:javascript
运行
复制
ID     | TITLE            | TRANSPORT_ID
------------------------------------------
1      | B-1              | 1
2      | B-2              | 1
3      | B-3              | 2

项目:

代码语言:javascript
运行
复制
ID     | TITLE            | BOX_ID    | TRANSPORT_ID
----------------------------------------------------
1      | I-1              | 1         | NULL
2      | I-2              | 2         | NULL
3      | I-3              | NULL      | 1
4      | I-4              | 3         | NULL
5      | I-5              | 3         | NULL
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-06 12:36:18

一个想法是实现所有可用的关系,然后相应地对它们进行汇总:

代码语言:javascript
运行
复制
SELECT 
t.id, 
t.transport_number, 
COUNT(distinct b.id) as box_count, 
COUNT(distinct i.id) + COUNT(distinct i2.id) as item_count
FROM transport t
LEFT JOIN box b ON t.id = b.transport_id
LEFT JOIN item i ON b.id = i.box_id
LEFT JOIN item i2 ON t.id = i2.transport_id
GROUP BY t.id
票数 1
EN

Stack Overflow用户

发布于 2018-11-06 12:08:49

如果性能不是一个问题,这应该是可行的:

代码语言:javascript
运行
复制
SELECT 
  transport.id,
  transport.transport_number,
  (SELECT COUNT(*) FROM box WHERE box.transport_id = transport.id) AS box_count,
  (SELECT COUNT(*) FROM item WHERE item.transport_id = transport.id OR item.box_id IN (SELECT id FROM box WHERE box.transport_id = transport.id)) AS item_count
FROM transport;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53169131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档