0

我已经与这个查询搏斗了很长时间,但无法让它工作。

我有一个相当简单的数据库结构,其中包括以下表格:(我省略了不必要的字段)

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 的一点帮助下做到这一点,但由于数据库很大,它最终会变慢..

包含数据的示例数据库:

如果不存在则创建表devices( idint(11) NOT NULL AUTO_INCREMENT, type_idint(11) NOT NULL, identificationvarchar(255) NOT NULL, PRIMARY KEY ( id), KEY type_id( type_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6;

插入devices( id, type_id, identification) 值 (1, 1, 'Device 1'), (2, 1, 'Device 2'), (3, 1, 'Device 3'), (4, 1, 'Device 4') , (5, 1, '设备 5');

如果不存在则创建表devices_documentsidint(11) NOT NULL AUTO_INCREMENT, device_idint(11) NOT NULL COMMENT 'devices.id', document_type_idint(11) NOT NULL COMMENT 'devices_types_document_types.document_type_id', filenamevarchar(255) NOT NULL,PRIMARY KEY ( id), KEY device_id( device_id, document_type_id) ) ENGINE=MyISAM 默认字符集=utf8 AUTO_INCREMENT=4 ;

插入devices_documents( id, device_id, document_type_id, filename) 值 (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( idint(11) NOT NULL AUTO_INCREMENT, device_type_idint(11) NOT NULL COMMENT 'devices.type_id', document_type_idint(11) NOT NULL COMMENT 'devices_documents.document_type_id', document_requiredint(1) NOT NULL, PRIMARY KEY ( id), KEY device_type_id( device_type_id, document_type_id) ) ENGINE=MyISAM 默认字符集=utf8 AUTO_INCREMENT=3 ;

插入devices_types_document_types( id, device_type_id, document_type_id, document_required) 值 (1, 1, 1, 1), (2, 1, 2, 1);

4

1 回答 1

0

像这样的东西?警告:未经测试

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
于 2013-11-07T13:52:14.620 回答