2013-08-25 6 views
0

У меня есть 3 таблицы:SQL: NN Select * из table1 и обнаружить, если существует связь с другими конкретным идентификатором пользователя

  • места
  • Пользователей
  • User_Likes_Place

Место имеет информацию о местах (id, address, number, name, bla bla) Пользователи имеют информацию о пользователях (id, name, age, bla bla) User_Likes_Place - это отношение между местами и Пользователи и имеет 3 столбца: id, id_place, id_user.

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

Результат должен быть что-то вроде этого:

place.id, place.name, place.address, place...., USER_LIKES_THIS_PLACE 
001, name001, addr001, blabla, 1 (or Y/N, I don't know..) 
002, name002, addr002, blabla, 0 
003, name003, addr003, blabla, 0 
004, name004, addr004, blabla, 1 
005, name005, addr005, blabla, 1 

Есть ли у вас какие-либо предложения? Спасибо вам всем.

ответ

1

Вот один из способов сделать это:

select p.*, 
     (case when ulp.id_user is not null then 'Y' else 'N' end) as UserLikesPlace 
from places p left outer join 
    user_like_places ulp 
    on p.id = ulp.id_place and 
     ulp.id_user = @IDUSER; 

Это делает предположение о том, что нет никаких дубликатов в user_like_places. Если это возможно, для удаления дубликатов вам понадобится distinct или group by.

left outer join хранит всю информацию обо всех местах. Затем он объединяется в таблицу сопоставления. Если есть совпадение, то ulp.id_user не является нулевым, и пользователю это нравится. В противном случае это NULL, и пользователь этого не делает. Если вам просто нужно 0 или 1, вы можете заменить оператор case на ulp.id_user is not null.

 Смежные вопросы

  • Нет связанных вопросов^_^