【发布时间】:2013-05-10 09:29:58
【问题描述】:
我有一个非常复杂的查询。我所拥有的是一个带有汽车零件的表(parts_list,大约 600 行),其中包含有关零件的一些信息,例如它的名称以及它是否依赖于电机。对于电机依赖,我有两个不同的查询,所以这是一个没有电机依赖的查询(0,我将其保存为布尔值)。大多数零件都可以拆卸并分解成更多零件,这就是为什么我将零件保存为一棵树,并且在该查询中我只取无法拆卸的零件(树叶)。此表仅代表可能部分的列表。现在对于每个汽车型号,我在另一个表(零件)中保存一行,然后将parts_list_id 和model_id 放在一起,然后是价格和数量。现在,如果我运行查询,它将在表“parts”中成功生成大约 500 行(仅获取叶子部分),它会做我需要的。模型 id 大约有 500 个(叶)零件。但有时我会为特定零件的另一个模型生成一行。然后查询不会产生其余的 499 行。它仅在 WHERE NOT EXISTS 选择查询返回 0 时才有效。即使存在一行,它也不会插入其余行。但这对我来说没有意义,因为它不应该像循环一样检查不同的值吗?
INSERT INTO parts (parts_list_id, model_id, motor_id)
SELECT orig1.id, '" . $this->model_id . "', '0'
FROM parts_list AS orig1
LEFT JOIN parts_list AS orig2 ON ( orig1.id = orig2.parent_id )
WHERE orig2.id IS NULL
AND orig1.motor_dependent = '0'
AND NOT EXISTS (
SELECT t1.id
FROM parts_list AS t1
LEFT JOIN parts_list AS t2 ON ( t1.id = t2.parent_id )
LEFT JOIN parts ON ( parts.parts_list_id = t1.id )
WHERE t2.id IS NULL
AND t1.motor_dependent = '0'
AND parts.parts_list_id = t1.id
AND parts.model_id = :model_id
)
【问题讨论】: