具有多个连接的SQLite查询

时间:2011-11-17 00:29:25

标签: sql sqlite join

我相信这只是一个简单的连接状态网。我最近没有使用SQL,似乎忘记了如何做到这一点。我所拥有的是一个列中包含少量列的项目,它引用另一个表格作为该字段的名称。像这样:

id, name, effect1, effect2, effect3, effect4

效果引用另一个仅包含aidname列的表格。我正在尝试做的是运行一个查询,为每个效果提取这些名称。

类似的东西:

SELECT i.name,e.name AS effect1, e.name AS effect2, e.name AS effect3, 
       e.name AS effect4 
FROM item i, effects e 
WHERE i.effect1 = e.name 
 AND i.effect2 = e.name 
 AND i.effect3 = e.name 
 AND i.effect4 = e.name

所以,假设我有一个像这样的值的项目:

Toast, 1, 2, 3, 4

效果如下:

1, burned
2, untoasted
3, wet
4, texas 

我希望它显示toast, burned, untoasted, wet, texas

和想法?

更新

Table items
id, name, weight, value, effect1,effect2,effect3,effect4

Table effects
id, name

在effect1中,...列是效果表中相应项目的ID号。许多项目将共享相同的效果,因此我决定使用连接来节省空间,而不是使用冗余数据来扩充这个已经很大的数据库。与此同时,我设法忘记这样做,大声笑

更新#2 这是我想要的效果,但不止一个效果列

SELECT i.name, i.weight,i.value, e.name AS 'effect 1' 
FROM ingredients i JOIN effects e ON effects._id=i.effect1

这适用于1,但如果我尝试做多次,它就会崩溃。任何想法我如何能够为所有4种效果获得这种效果?

1 个答案:

答案 0 :(得分:18)

每列都需要一个明确的连接:

SELECT i.name
      ,i.weight
      ,i.value
      ,e1.name AS effect1
      ,e2.name AS effect2
      ,e3.name AS effect3
      ,e4.name AS effect4
FROM   ingredients i 
LEFT   JOIN effects e1 ON e1.id = i.effect1
LEFT   JOIN effects e2 ON e2.id = i.effect2
LEFT   JOIN effects e3 ON e3.id = i.effect3
LEFT   JOIN effects e4 ON e4.id = i.effect4

进行LEFT JOIN,以便在效果表中缺少任何效果时不会丢失该行。
此外,此查询还取决于effects.id 唯一

这是另一种做同样的方法:

SELECT i.name
      ,i.weight
      ,i.value
      ,(SELECT e.name FROM effects e WHERE e.id = i.effect1) AS effect1
      ,(SELECT e.name FROM effects e WHERE e.id = i.effect2) AS effect2
      ,(SELECT e.name FROM effects e WHERE e.id = i.effect3) AS effect3
      ,(SELECT e.name FROM effects e WHERE e.id = i.effect4) AS effect4
FROM   ingredients i

关于数据库布局:

如果每个ingredient有4个effects,那么您的数据库设计就可以了。如果效果数量不同或每个效果都有其他信息,您可以考虑n:mingredients之间的effects关系,由附加表格实现。 (替换四个效果*列。) 可能看起来像这样:

CREATE TABLE ingredients_effects
(
  ingredients_id integer references ingredients(id)
 ,effects_id     integer references effects(id)
-- more attributes like quantity or notes?
);

fine manual has the details