SQLite-запрос с несколькими объединениями - PullRequest
10 голосов
/ 17 ноября 2011

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

id, name, effect1, effect2, effect3, effect4

Эффекты ссылаются на другую таблицу, в которой есть только столбцы a, id и name.То, что я пытаюсь сделать, это запустить запрос, который будет извлекать эти имена для каждого из этих эффектов.

Что-то вроде:

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, ... указывается номер идентификатора соответствующего элемента в таблице эффектов.Многие элементы будут использовать одни и те же эффекты, поэтому вместо того, чтобы наполнять эту и без того большую базу данных избыточными данными, я решил использовать объединение для экономии места.В то же время мне удалось как забыть это сделать, 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 Ответ

18 голосов
/ 17 ноября 2011

Вам необходимо отдельное объединение для каждого столбца:

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

Подробное руководство содержит подробности .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...