#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