Запрос SQLite с несколькими соединениями

это очень много, просто присоединюсь заявления я считаю. В последнее время я не работал с SQL и, похоже, забыл, как это сделать. У меня есть элемент с несколькими столбцами в нем, которые ссылаются на другую таблицу для имени этого поля. Такой

id, name, effect1, effect2,effect3,effect4

эффекты ссылаются на другую таблицу, которая имеет только столбец ИД и имя. Что я пытаюсь сделать, это запустить запрос, который вытащит эти имена для каждого из этих эффектов

что-то вроде

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 

Я хочу, чтобы он отображал тост, сожженный, необжаренный, мокрый, Техас

и идеи?

обновление

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

Table effects
id, name

в effect1,... столбцы ID-номер соответствующего элемента в таблице. Многие элементы будут делиться теми же эффектами, поэтому вместо раздувания этой уже большой базы данных с избыточные данные, я решил использовать join для экономии места. В то же время мне удалось забыть об этом, lol

обновление #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 ответов


вам нужно отдельное соединение для каждого столбца:

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

сделайте это левое соединение, чтобы вы не потеряли строку, если какой-либо из эффектов отсутствует в таблице эффектов.
Кроме того, этот запрос зависит от 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:m отношения между ingredients и effects, реализовано дополнительной таблицей. (Замена четырех столбцов эффекта*.) Может выглядеть так:

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

на прекрасное руководство имеет детали.