2017-01-05 3 views
0

Join & Require Queryというのは、おそらく正しい用語ではないため、私が意味することを説明する必要があります。この質問のために、ビデオゲームのためのワイヤフレームから外れるテーブルの非常に単純なサブセットを設定しました。私は事前にお詫びします、SQLFiddleは今働いていません。Join&Requireクエリを作成する方法を理解するのに問題があります

CREATE TABLE reqs (
    crafted_id INT, item_id INT); 

CREATE TABLE items (
    id INT, name VARCHAR(30)); 

CREATE TABLE crafted (
    id INT, name VARCHAR(30)); 

これらの表では、サンプルデータもいくつか作成しました。私はこれらのテーブルでauto_incrementを使用しなかったので、より優れた視覚効果を得ることができました。この例では

INSERT INTO items (id, name) VALUES (1, 'Herbs'); 
INSERT INTO items (id, name) VALUES (2, 'Health Potion'); 
INSERT INTO items (id, name) VALUES (3, 'Leather'); 
INSERT INTO items (id, name) VALUES (4, 'Sticks'); 

INSERT INTO crafted (id, name) VALUES (101, 'Cured Leather'); 
INSERT INTO crafted (id, name) VALUES (102, 'Tea'); 

INSERT INTO reqs (crafted_id, item_id) VALUES (101, 1); 
INSERT INTO reqs (crafted_id, item_id) VALUES (101, 3); 
INSERT INTO reqs (crafted_id, item_id) VALUES (102, 1); 

私はセットアップに細工された項目が他の項目を必要とするゲームでクラフトシステムの非常に最小限の例があります。

itemsに基づいてcraftedテーブルから利用可能な値をすべて取得できるクエリを作成する必要があります。例えば、上記のデータに基づいて、私は次のようにします:

requestCraftableItems(itemArray) { 
    // Execute query based on array here 
}; 

requestCraftableItems([1, 2, 3]) 

これは、ユーザーがアイテム1, 3, & 4を持っていることを示すクエリを実行し、reqs.crafted_idためreqs.item_idの全てが満たされたcraftedエントリを検索してみてくださいアイテム配列に格納されます。

requestCraftableItems([1, 3, 4]); 

それは、細工されたエントリを返す必要があります:硬化皮革用crafted_id項目1 & 3を必要とし、ユーザーは次のことを実行した場合teaためcrafted_idだからアイテム1

を必要とするため、この例では何も、返されるべきではありませんユーザが1 & 3をクエリに提供したので、Cured LeatherTeaです。

これは私のもともとの使用例ではなく、私が非常に単純なスケールで何をしようとしているのかのポイントを得るための単なる例です。

EDIT:値は、(1)クエリに渡された場合、硬化革が必要とclairfyするには、Cured Leatherは、結果に表示されてはならないBOTH 1と3

+0

を含むことができ、私はあなたが何を意味するかわからないんだけど@Strawberry、シーケンスは指定されたパラメータに基づいて共有されています。 '1'を供給するだけで' Tea'が返されますが、 '1&3'を供給すると' Tea&Cured Leather'が供給されます。彼らが一緒にいるので、なぜ/私はこれらを分けるのか分からない。 – Hobbyist

+0

@Strawberry私はあなたがそれをより明確にする方法を提案していることを理解しています。私はあなたの提案を理解していません。それで全部です。 idカラムの良い点。ありがとう。 – Hobbyist

+0

@Strawberryありがとうございました。 – Hobbyist

答えて

0

私はあなたが探しているものを誤解している可能性がありあなたの望む結果が返されます。

SELECT crafted.name 
FROM items 
JOIN reqs 
ON reqs.item_id = items.id 
JOIN crafted 
ON crafted.id = reqs.crafted_id 
WHERE items.id in (1,3,4) 
GROUP BY crafted.id 

これは例の結果を返します。テストされていない

、タイプミス

+0

'reqsのすべてがある' crafted'テーブルからデータを返す必要があります。 'reqs.crafted_id'のためのitem_idがセット内に供給される。 – Hobbyist

+0

このクエリーを修正して正しい方法で作業することができましたが、 'IN(1)'だけが渡された場合、 'Tea'と' Cured Leather'の結果が表示されますが、厄介な1と3が供給されている場合。 – Hobbyist

+0

@Hobbyist 'HAVING COUNT(*)= INの引数の数'またはその変形です。まだ苦労している場合は、http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-bea-a-を参照してください。非常にシンプルなSQLクエリ – Strawberry

関連する問題