SQL - Как получить заголовок избранного сообщения пользователя из базы данных StackExchange

Я работаю над проектом, анализирующим поведение пользователя Stackoverflow, и мне нужно получить данные из stackoverflow, одна из данных, которые мне нужно получить, - это получить заголовок любимых сообщений пользователя из базы данных stackexchange. Прямо сейчас я только понял, как получить любимую информацию пользователя следующим образом:

select VT.name, U.DisplayName
from VoteTypes VT, Votes V, Users U
where VT.Id = 5 and
           VT.Id = V.VoteTypeId and
           U.Id = V.UserId and 
           U.Id = '85597'

Я думаю, что следующий шаг - найти сообщения, за которые проголосовал пользователь, а затем сопоставить userId. Но я не знаю, правильный ли это шаг. И я не смог найти никакой связи между голосованием пользователя и заданием с вопросом.


person Leo Li    schedule 02.11.2017    source источник
comment
никто больше не должен присоединяться с использованием таблиц, разделенных запятыми, прошло более 25 лет с момента формализации явного синтаксиса соединения. Пора менять.   -  person Paul Maxwell    schedule 03.11.2017
comment
@Used_By_Already на что мне перейти? Поскольку я сейчас прохожу курс по базам данных, и он научил меня использовать этот способ.   -  person Leo Li    schedule 03.11.2017


Ответы (1)


SELECT
      vt.name
    , u.DisplayName
FROM VoteTypes vt 
   , Votes v        <<<<<<<<< not good
   , Users u        <<<<<<<<< not good
WHERE vt.Id = 5
AND vt.Id = v.VoteTypeId  <<<<<<<<< join predicate (vt = v)
AND u.Id = v.UserId       <<<<<<<<< join predicate (u = v)
AND u.Id = '85597

Просто ПРЕКРАТИТЕ использовать запятые между именами таблиц. 'Этот простой шаг заставит вас более внимательно рассмотреть соединения.

Переместите предикаты соединения в таблицу, на которую они ссылаются, ПОСЛЕ ВКЛ. (Предикаты объединения относятся к разным таблицам по обе стороны от оператора, например, равно.)

SELECT
      vt.name
    , u.DisplayName
FROM VoteTypes vt
   , Votes v ON vt.Id = v.VoteTypeId
   , Users u ON u.Id = v.UserId
WHERE vt.Id = 5
AND 
AND 
AND u.Id = '85597'

Замените эти ужасные запятые на соответствующий тип соединения и приведите в порядок.

SELECT
      vt.name
    , u.DisplayName
FROM VoteTypes vt
INNER JOIN Votes v ON vt.Id = v.VoteTypeId
INNER JOIN Users u ON u.Id = v.UserId
WHERE vt.Id = 5
AND u.Id = '85597'

Готово.

Если в вашем курсе используется старый синтаксис; подумайте о том, чтобы получить лучший курс.

person Paul Maxwell    schedule 03.11.2017
comment
Спасибо за исправление! Мне интересно, не могли бы вы также помочь мне с контентом? - person Leo Li; 03.11.2017
comment
Теперь ваш вопрос решен? У вас еще есть вопросы по поводу этого ответа? Чтобы принять ответ, Нажмите на галочку, чтобы получить дополнительную информацию, см. help/accepting - person Paul Maxwell; 15.11.2017