Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql列出直接和间接子记录_Mysql_Sql - Fatal编程技术网

MySql列出直接和间接子记录

MySql列出直接和间接子记录,mysql,sql,Mysql,Sql,我有一个用于处理传输项的3表DB模式。运输工具可以包含多个箱子和多个项目。除此之外,一个盒子还可以包含多个项目。因此,项目可以直接或间接连接到传输 简化的DDL如下所示: CREATE TABLE transport ( `id` int(11) NOT NULL AUTO_INCREMENT, `transport_number` varchar(50) NOT NULL, `transport_date` datetime NOT NULL ) CREATE TABLE box

我有一个用于处理传输项的3表DB模式。运输工具可以包含多个箱子和多个项目。除此之外,一个盒子还可以包含多个项目。因此,项目可以直接或间接连接到传输

简化的DDL如下所示:

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
)
我尝试实现一个查询,通过框和项目计数选择所有传输。大概是这样的:

预期结果:

TRANSPORT_ID | TRANSPORT_NUMBER | BOX_COUNT | ITEM_COUNT
--------------------------------------------------------
1            | T1               | 2         | 3
2            | T2               | 1         | 2
样本数据

运输:

ID     | TRANSPORT_NUMBER | TRANSPORT_DATE
------------------------------------------
1      | T1               | 2018-11-06
2      | T2               | 2018-11-06
方框:

项目:


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

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;

一个想法是实现所有可用的关系,然后相应地将它们相加:

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

样本数据和期望的结果将非常有用。两个问题对于一个“问题”来说太多了。用样本数据和预期结果编辑了我的问题。
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;
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