SQL выбирает две строки из одной таблицы (фактически из одного столбца) на основе объединения с другой таблицей

#sql #join

#sql #Присоединиться

Вопрос:

У меня есть две таблицы: votes и submissions . votes хранит все полученные голоса (каждый человек может отдать первый и второй голос), submissions содержит элементы, за которые люди могут проголосовать. Каждый элемент имеет свой собственный идентификатор. В votes таблице хранится идентификатор каждого голосования. Я хочу получить имена элементов, за которые люди голосуют. Вот пример того, как выглядят таблицы:

votes:

 **voter** | **vote1_ID** | **vote2_ID**
   Foo    |       1      |       2
   Bar    |       3      |       2
   Mark   |       2      |       3
  

submissions:

 **ID** | **name**
   1   |   John
   2   |   Jane
   3   |   Mary
  

Я уже говорил, что хочу получить как имя, связанное с первым голосованием, так и имя, связанное со вторым голосованием, в рамках одного запроса (на самом деле, мне все равно, сколько запросов требуется, но один запрос, конечно, всегда приятнее и чище). Как бы я продолжал это делать? Я уже пытался понять, что мне нужно использовать соединение, но я не могу понять, как дважды извлечь значение из одного и того же столбца. столбец.

РЕДАКТИРОВАТЬ: я подумал, что может быть полезно привести пример того, какой запрос я пытаюсь выполнить:

Например, если я хочу посмотреть, за что проголосовал Bar, результатом запроса должны быть представления.назовите дважды. В результате Mark это Джейн и Мэри.

Ответ №1:

Вы можете выполнить два внутренних объединения для выбора отдельных значений.

 SELECT s1.name, s2.name 
FROM votes v
INNER JOIN submissions s1 ON v.vote1_ID = s1.ID
INNER JOIN submissions s2 ON v.vote2_ID = s2.ID
  

Ответ №2:

Вы должны join дважды просмотреть таблицу представлений, чтобы получить ожидаемый результат.

 select v.voter, s1.name, s2.name 
from votes v 
join submissions s1 on v.vote1_id = s1.id
join submissions s2 on v.vote2_id = s2.id
  

Комментарии:

1. Мне не обязательно нужен v.избиратель. Требуется ли это для того, как вы создали свой запрос?

2. нет .. вы можете удалить его из select , если вам это не нужно.

3. Это кажется довольно нелогичным.

Ответ №3:

И если вам нужны строки вместо столбцов, вы можете выполнить два объединения и объединить их вместе:

 select v.voter, s1.name
from votes v 
join submissions s1 on v.vote1_id = s1.id
UNION ALL
select v.voter, s2.name
from votes v 
join submissions s2 on v.vote2_id = s2.id