Поэтому у меня возникают проблемы с извлечением определенного типа записей из базы данных.
У меня три таблицы
Вот пример того, как выглядит таблица
Friends:
|id | senderId | receiverId | accepted |
|---|----------| -----------| ---------|
| 1 | 1 | 12 | 1 |
| 2 | 12 | 2 | 1 |
| 2 | 12 | 2 | 1 |
Followers:
| id | userId | UserIsFollowing |
| -- | ------ | --------------- |
| 1 | 12 | 63 |
| 2 | 22 | 12 |
PictureGalleries:
| id | UserId |
| -- | ------ |
| 1 | 13 |
| 2 | 12 |
| 3 | 1 |
| 4 | 10 |
| 5 | 2 |
| 6 | 63 |
Так вот, вот проблема!
Я хочу выбрать все из картинных галерей
Если у пользователя есть отношения дружбы с userId 12, где принято 1
И где пользовательскийID 12 следует за конкретным пользователем
Итак, в основном я хочу посмотреть, как выглядит галерея изображений следующих пользователей ID: 1,2 и 63, которые будут выглядеть так:
| id | UserID |
| -- | ------ |
| 3 | 1 |
| 5 | 2 |
| 6 | 6 |
Я просто надеюсь, что я не смутил вас, ребята. Спасибо!
использовать союз и подзапрос, чтобы получить желаемый результат
select p.id,p.UserId from
( select UserIsFollowing as id from
Followers fl where userId =12
union select senderId from friends f
where f.receiverId =12 AND accepted=1
union select receiverId from friends f
where f.senderId =12 AND accepted=1
) as t join PictureGalleries p on t.id=p.UserId
Я думаю, что этот запрос показывает, что вы хотите:
select * from PictureGalleries
join Followers on Followers.userId = PictureGalleries.UserId
where exists (select 1 from Friends where (Friends.senderId = PictureGalleries.UserId or Friends.receiverId = PictureGalleries.UserId) and accepted = 1)
and Followers.UserIsFollowing = :user_id
Но я думаю, что ваша модель может быть улучшена
РЕДАКТИРОВАТЬ:
Возможно, вы сначала сказали это неправильно, когда сказали:
"Если идентификатор пользователя имеет отношения дружбы с userId 12, где принято 1, и где идентификатор пользователя 12 следует за конкретным пользователем"
Я думаю, вы имеете в виду OR, поэтому SQL должен выглядеть примерно так:
select * from PictureGalleries
where exists (select 1 from Friends where (Friends.senderId = PictureGalleries.UserId or Friends.receiverId = PictureGalleries.UserId) and accepted = 1)
OR exists (select 1 from Followers where Followers.userId = PictureGalleries.UserId and Followers.UserIsFollowing = :user_id