Php 计算按要求标记的项目以及其他表格中缺失或部分存在的项目

Php 计算按要求标记的项目以及其他表格中缺失或部分存在的项目,php,mysql,database,Php,Mysql,Database,我已经为这个问题绞尽脑汁很久了,现在无法让它工作 我有一个相当简单的数据库结构,包括以下表格: (我省略了不必要的字段) 现在,假设我有5台设备,它们的“设备类型”附带了2个必需的“文档类型”,例如“采购发票(文档类型id:1)”和“保修文档(文档类型id:2)”。我已经上传了数据库中5台设备的3个文档。我需要一个查询(如果可能的话)来使用这些表返回所有设备以及其中丢失的文档数。在我的示例中,我将收到一个包含5个设备的列表,其中一个设备中有“1”作为丢失的文档(设备id:2),其中一个设备有0个

我已经为这个问题绞尽脑汁很久了,现在无法让它工作

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

现在,假设我有5台设备,它们的“设备类型”附带了2个必需的“文档类型”,例如“采购发票(文档类型id:1)”和“保修文档(文档类型id:2)”。我已经上传了数据库中5台设备的3个文档。我需要一个查询(如果可能的话)来使用这些表返回所有设备以及其中丢失的文档数。

在我的示例中,我将收到一个包含5个设备的列表,其中一个设备中有“1”作为丢失的文档(设备id:2),其中一个设备有0个丢失的文档(设备id:1)其余3台没有上传文档的设备类型中,缺少文档的数量为“2”。
我建立了一些查询,但到目前为止运气不好。。任何想法都值得赞赏

我知道我可以在PHP的帮助下完成这项工作,但由于数据库太大,最终速度会变慢。

包含数据的示例数据库:

如果不存在,则创建表
设备
(
id
int(11)非空自动增量,
type_id
int(11)不为空,
标识
varchar(255)不为空, 主键(
id
), 键
类型id
类型id
) )ENGINE=InnoDB默认字符集=utf8自动增量=6

插入
设备
id
type\u id
标识
)值 (1,1,‘装置1’), (2,1,‘装置2’), (3,1,“装置3”), (4,1,“装置4”), (5,1,‘装置5’)

如果不存在,则创建表
设备\u文档
(
id
int(11)非空自动增量,
device\u id
int(11)非空注释'devices.id',
document\u type\u id
int(11)非空注释“devices\u types\u document\u types.document\u type\u id”,
filename
varchar(255)不为空, 主键(
id
), 键
设备id
设备id
文档类型id
) )ENGINE=MyISAM默认字符集=utf8自动增量=4

设备\文档
id
设备\ id
文档\类型\ id
文件名
)值中插入 (1,1,1,'键入\u 1 \u表示\u设备\u 1.pdf'), (2,1,2,'type_2_for_device_1.pdf'), (3,2,1,'type_1_for_device_2.pdf')

如果不存在,则创建表
设备\u类型\u文档\u类型
(
id
int(11)非空自动增量,
device\u type\u id
int(11)非空注释'devices.type\u id',
document\u type\u id
int(11)非空注释“devices\u documents.document\u type\u id”,
document\u required
int(1)不为空, 主键(
id
), 键
设备类型id
设备类型id
文档类型id
) )ENGINE=MyISAM默认字符集=utf8自动增量=3

设备类型文档类型中插入
id
设备类型id
文档类型id
所需文档类型)值
(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

您能否提供一些示例数据,以便我们更好地了解情况?我不确定我是否完全理解被问到的问题。(可能只是我)您可以使用不在或不存在。我修改了问题以满足提供的示例数据。您好,每个设备类型id(devices.type\u id)的所需文档数应来自“devices\u types\u document\u types”表,只需对该表执行另一个SELECT COUNT(*),而不是仅将“2”放在那里。这就是你说的吗?更新了我的答案以反映你提供的示例数据。这对我来说很好。有一秒钟,我以为这就是问题所在,但还是有一个小问题,我也会尝试自己解决,但是:如果我上传了两个文档,它们都是相同的文档类型,而另一个必需的文档没有上传,它会显示“0缺失”,应该是“1缺失”。不知何故,在比较真正缺少的内容和没有缺少的内容时,它没有考虑到文档类型?正常工作:)将“从设备\文档dC选择计数(*)更改为“从设备\文档dC选择计数(不同的(dC.document\类型\ id))”
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