使用多个连接的SQLite查询

qhhrdooz  于 2023-03-23  发布在  SQLite
关注(0)|答案(1)|浏览(157)

我相信这只是一个简单的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个效果?

qnzebej0

qnzebej01#

你需要为每一列创建一个不同的连接:

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.idunique
您可以使用相关的子查询实现相同的功能:

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,那么您的数据库设计就很好。如果效应的数量不同,或者您对每个效应都有额外的信息,那么您可以考虑在ingredientseffects之间建立n:m关系,通过额外的表来实现。(替换四个effect* 列。)可能看起来像这样:

CREATE TABLE ingredients_effects (
  ingredients_id integer REFERENCES ingredients(id)
, effects_id     integer REFERENCES effects(id)
  -- additional data like quantity or notes?
, PRIMARY KEY (ingredients_id, effects_id)
);

More details in the fine manual.

相关问题