因此,我想我应该解释Join & Require Query的含义,因为这可能不是正确的术语。对于这个问题,我建立了一个非常简单的表子集,该子集将不在视频游戏的线框中。预先致歉,SQLFiddle目前无法正常工作。

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);


在此示例中,我设置了游戏中制作系统的非常简单的示例,其中制作的物品需要其他物品。

我需要创建一个查询,在该查询中可以根据自己拥有的crafteditems表中提取所有可用值。例如,根据上面的数据,我将执行以下操作:

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

requestCraftableItems([1, 2, 3])


这应该执行一个查询,说明用户有项目1, 3, & 4,并尝试找到一个crafted条目,其中reqs.item_id的所有reqs.crafted_id在项目数组中都得到满足。在此示例中,不应返回任何内容,因为固化皮革的crafted_id需要项1 & 3,而tea的crafted_id需要项1

因此,如果用户执行以下操作:

requestCraftableItems([1, 3, 4]);


当用户向查询提供Cured Leather时,它应返回Tea1 & 3的精心制作的条目。

这不是我最初的用例,仅是一个示例,可以很简单地了解我正在尝试做的事情。

编辑:为了聪明起见,如果将值(1)传递给查询,则Cured Leather不应出现在结果中,因为固化皮革需要1和3都需要。

最佳答案

我可能会误解了您要寻找的内容,但是简单的联接应该返回您想要的结果:

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


这将返回示例中的结果。

未经测试,可能包含错别字

10-04 16:07
查看更多