php - 计算按要求标记的项目以及另一个表中缺失或部分存在的项目

标签 php mysql database

我已经为这个查询苦苦挣扎了很长时间,但无法让它工作。

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

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 ;

插入设备(idtype_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(iddevice_iddocument_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(iddevice_type_iddocument_type_iddocument_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/

相关文章:

mysql - Eloquent hasOne和一张大表,在查询中不做限制

database - JPA - 计算列作为实体类属性?

php - 使用 PHP 编写程序时遇到问题

database - 对象查询的 Couchbase 对象

mysql - SQL 执行一个查询,然后根据结果执行另一个查询

PHP - 将项目添加到关联数组的开头

php - PHP 5.2.x 中的意外 T_PAAMAYIM_NEKUDOTAYIM

php - 通过functions.php覆盖小部件

php - PHP 中的多个动态 SEO/缩短的 URL

MySQL统计同一个表中的不同值