我已经与这个查询搏斗了很长时间,但无法让它工作。
我有一个相当简单的数据库结构,其中包括以下表格:(我省略了不必要的字段)
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
(
id
int(11) NOT NULL AUTO_INCREMENT,
type_id
int(11) NOT NULL,
identification
varchar(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_documents
(
id
int(11) NOT NULL AUTO_INCREMENT,
device_id
int(11) NOT NULL COMMENT 'devices.id',
document_type_id
int(11) NOT NULL COMMENT 'devices_types_document_types.document_type_id',
filename
varchar(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
(
id
int(11) NOT NULL AUTO_INCREMENT,
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, 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);