私は MySQL データベースを使用しています。これが私の状況です。
N 個の消耗品 (N は消耗品の配列) を使用して完了することができるプロジェクトのリストを取得できるようにするには、選択クエリが必要です。このプロジェクトのリストには、N の供給品の一部またはすべてを使用して完了することができるすべてのプロジェクトを含める必要がありますが、N にリストされていない供給品を必要とするプロジェクトを含めることはできません(たとえば、下の表のスケッチ プロジェクトでは、紙には代替物がありません。ただし、鉛筆はペンで置き換えることができます. クエリが、鉛筆、ペン、および鉛筆削りを使用して完成できるプロジェクトを検索する場合、'make sketch' は、完成できるプロジェクトとして返されるべきではありません。消耗品が記載されています)
さらに、特定のプロジェクトで必要なサプライ品の一部は、他のサプライ品に置き換えることができます。ただし、あるプロジェクトが代替供給品目を使用できるからといって、別のプロジェクトが同じ代替品で機能するとは限りません。(たとえば、以下のシャープペンシル プロジェクトでは、ペンを鉛筆の代わりにすることはできませんが、make drawing では可能です)
これらは私のテーブルです:
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
。同じ供給要件を単に満たすだけではありません。
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 ステートメントなどを使用するのと同様のものですか?
私が経験していた問題の 1 つは、クエリで指定されているように用紙がないにもかかわらず、上記のクエリが有効なプロジェクトとして「スケッチを作成」を返すことです。
最終的な目標は、多くのプロジェクトと多くの物資を使って大規模にこれを達成できるようにすることです。
更新:データベースの設計に問題があり、供給品に複数の代替品を持たせることができませんでした。多くの代用を可能にするために問題を修正し、必要に応じて上記の表を更新したため、SELECT
上記のクエリは適用できなくなりました。ただし、この投稿の上部に記載されているのと同じ目標を達成する必要があります。