我有一个处理传输项的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方框:
ID | TITLE | TRANSPORT_ID
------------------------------------------
1 | B-1 | 1
2 | B-2 | 1
3 | B-3 | 2项目:
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发布于 2018-11-06 12:36:18
一个想法是实现所有可用的关系,然后相应地对它们进行汇总:
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发布于 2018-11-06 12:08:49
如果性能不是一个问题,这应该是可行的:
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;https://stackoverflow.com/questions/53169131
复制相似问题