我已经为这个查询苦苦挣扎了很长时间,但无法让它工作。
我有一个相当简单的数据库结构,其中包括下表: (我省略了不必要的字段)
DEVICES
-------
id
identification
type_id (type of device)
DEVICES_TYPES_DOCUMENT_TYPES
----------------------------
id
device_type_id INT
document_type_id INT
document_required INT(1) (has a value of 0 = not required for this device type OR 1 = required)
DEVICES_DOCUMENTS
-----------------
id
device_id
document_type_id
filename
现在,假设我有 5 台设备,它们的“设备类型”附加了 2 个必需的“文档类型”,例如“购买发票 (document_type_id: 1)”和“保修文档 (document_type_id: 2)”。我一共上传了数据库中5台设备的3个文档。我需要一个查询(如果可能)来使用这些表返回所有设备以及其中丢失文档的数量。
在我的示例中,我将收到 5 个设备的列表,其中其中一个设备它们有“1”作为缺失文档(设备 ID:2),其中一台有 0 个缺失文档(设备 ID:1),其余 3 个设备没有附加到其设备类型的上传文档,有“2”作为缺失文档丢失文件的数量。
我已经建立了一些查询,但到目前为止还没有运气。任何想法表示赞赏!
我知道我可以在 PHP 的帮助下做到这一点,但由于数据库很大,它最终会变得很慢。
包含数据的示例数据库:
如果不存在则创建表设备
(
id
int(11) NOT NULL AUTO_INCRMENT,
type_id
int(11) NOT NULL,
标识
varchar(255) NOT NULL,
主键(id
),
KEY type_id
(type_id
)
) ENGINE=InnoDB 默认字符集=utf8 AUTO_INCRMENT=6 ;
插入设备
(id
、type_id
、标识
)值
(1, 1, '设备 1'),
(2, 1, '设备 2'),
(3, 1, '设备 3'),
(4, 1, '设备 4'),
(5, 1, '设备 5');
如果不存在则创建表devices_documents
(
id
int(11) NOT NULL AUTO_INCRMENT,
device_id
int(11) NOT NULL COMMENT 'devices.id',
document_type_id
int(11) NOT NULL COMMENT 'devices_types_document_types.document_type_id',
文件名
varchar(255) NOT NULL,
主键(id
),
KEY device_id
(device_id
,document_type_id
)
) ENGINE=MyISAM 默认字符集=utf8 AUTO_INCRMENT=4 ;
插入devices_documents
(id
、device_id
、document_type_id
、文件名
)值(value)观
(1, 1, 1, 'type_1_for_device_1.pdf'),
(2, 1, 2, 'type_2_for_device_1.pdf'),
(3, 2, 1, 'type_1_for_device_2.pdf');
如果不存在则创建表devices_types_document_types
(
id
int(11) NOT NULL AUTO_INCRMENT,
device_type_id
int(11) NOT NULL COMMENT 'devices.type_id',
document_type_id
int(11) NOT NULL COMMENT 'devices_documents.document_type_id',
document_required
int(1) NOT NULL,
主键(id
),
KEY device_type_id
(device_type_id
,document_type_id
)
) ENGINE=MyISAM 默认字符集=utf8 AUTO_INCRMENT=3 ;
插入devices_types_document_types
(id
、device_type_id
、document_type_id
、document_required
)值(value)观
(1,1,1,1),
(2,1,2,1);
最佳答案
有这样的事吗?警告:未经测试
SELECT ((SELECT COUNT(*) FROM devices_types_document_types WHERE device_type_id = d.type_id)-(SELECT COUNT(*) FROM devices_documents dC, devices_types_document_types dT WHERE dC.device_id = d.id AND dT.device_type_id = d.type_id AND dC.document_type_id = dT.document_type_id AND dT.document_required = 1)) as missing_documents, d.* FROM devices d
关于php - 计算按要求标记的项目以及另一个表中缺失或部分存在的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19837184/