我正在使用 MySQL 数据库,这是我的情况:
我需要一个选择查询才能获得可以使用 N 个耗材完成的项目列表,其中 N 是耗材数组。此项目列表必须包括可以使用任何或所有 N 个耗材完成的所有项目,但不能包括任何需要 N 中未列出的耗材的项目。但是,铅笔可以用钢笔代替。如果查询搜索可以使用铅笔、钢笔和卷笔刀完成的项目,那么“制作草图”不应该作为可以完成的项目返回,即使它使用了一些列出的用品)
此外,某些项目所需的一些用品可以用其他用品代替;但是,仅仅因为一个项目可以使用替代供应项目并不意味着另一个项目可以使用相同的替代品。(例如,在锐化铅笔项目中,钢笔不能代替铅笔,但是,对于绘图它可以)
这些是我的表:
Projects
+----+---------------------+
| id | name |
+----+---------------------+
| 1 | make sketch |
| 2 | sharpen pencil |
| 3 | make paper airplane |
+----+---------------------+
Supplies
+----+------------------+
| id | name |
+----+------------------+
| 1 | paper |
| 2 | pencil |
| 3 | pen |
| 4 | pencil sharpener |
+----+------------------+
ProjectSupplies
+----+-----------+------------+
| id | projectid | supplyid |
+----+-----------+------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 2 |
| 4 | 2 | 4 |
| 5 | 3 | 1 |
+----+-----------+------------+
SubstituteSupplies
+-------------------+------------+
| projectsuppliesid | supplyid |
+-------------------+------------+
| 2 | 3 |
+-------------------+------------+
这些数据无论如何都不是详尽无遗的,但您应该明白这一点。
这是我在更新数据库之前提出的查询(请参阅下面的更新),但是,它违反了规则,因为查询结果包括需要纸张的项目,仅仅是因为COUNT
它既是 supplyid 又是替代品作为两个单独的要求,而不是而不是简单地满足相同的供应要求。
SELECT projects.name FROM supplies
INNER JOIN projectsupplies ON supplyid = supplies.id OR substitute = supplies.id
INNER JOIN projects ON projects.id = projectid
WHERE supplies.id IN (2,3,4)
GROUP BY projects.name
HAVING COUNT(*) <= 3
ORDER BY projects.id
有没有办法扭转这个:
INNER JOIN projectsupplies ON supplyid = supplies.id OR substitute = supplies.id
本质上是这样的:
INNER JOIN projectsupplies ON (supplies.id = supplyid) ? (supplies.id = supplyid) : (supplies.id = substitute)
或类似于使用 if 语句或其他任何东西以使查询结果正确?
我遇到的一个问题是,上面的查询将返回“make sketch”作为一个有效的项目,即使在查询中指定,没有纸。
最终目标是能够通过许多项目和许多供应大规模地实现这一目标。
更新:我在我的数据库设计中发现了一个问题,导致不可能允许供应有多个替代品。我更正了问题以允许许多替代品,并根据需要更新了上面的表格,所以现在SELECT
上面的查询不再适用。但是,我仍然需要完成本文顶部提到的相同目标