Sql 使用“选择多对多关系”;拥有;柱
我努力解决以下问题: 我的数据库中有两个表: 视频和用户\u视频作为视频和用户之间的轴心(我从令牌接收用户\u id,所以用户表位于另一个db中) 有了一个用户id,我想选择所有视频并附加一个列,其中包含true或false,无论用户是否拥有视频 到目前为止,我通过以下查询实现了这一点:Sql 使用“选择多对多关系”;拥有;柱,sql,postgresql,many-to-many,Sql,Postgresql,Many To Many,我努力解决以下问题: 我的数据库中有两个表: 视频和用户\u视频作为视频和用户之间的轴心(我从令牌接收用户\u id,所以用户表位于另一个db中) 有了一个用户id,我想选择所有视频并附加一个列,其中包含true或false,无论用户是否拥有视频 到目前为止,我通过以下查询实现了这一点: SELECT v.*, TRUE AS has_video FROM users_videos AS uv RIGHT JOIN videos AS v ON uv.video_id = v.id W
SELECT v.*, TRUE AS has_video FROM users_videos AS uv
RIGHT JOIN videos AS v
ON uv.video_id = v.id
WHERE (uv.user_id = 1)
UNION
(
SELECT v.*, FALSE AS has_video FROM videos AS v
EXCEPT
SELECT v.*, FALSE AS has_video FROM users_videos AS uv
RIGHT JOIN videos AS v
ON uv.video_id = v.id
WHERE (uv.user_id = 1)
)
虽然它会选择所有视频3次。对于这类问题有没有更好的解决方案
@编辑---
表结构
users_videos:
id integer
user_id integer
video_id integer
videos:
id: integer
title: string
示例数据:
用户和视频
| id | user_id | video_id
-------------------------
1 1 1
录像带
| id | title |
----------------
1 | Example 1
-----------------
2 | Example 2
-----------------
预期结果:
| id | title | has_video
------------------------------
1 | Example 1 | true
------------------------------
2 | Example 2 | false
------------------------------
@更新--
使用@Stefano Zanini方法:
SELECT DISTINCT
v.*,
CASE
WHEN uv.user_id IS NULL OR uv.user_id <> 1 THEN FALSE
ELSE TRUE
END has_video
FROM videos v
LEFT JOIN
users_videos uv
ON uv.video_id = v.id
选择DISTINCT
v、 *,
案例
当uv.user_id为NULL或uv.user_id为1时,则为FALSE
否则是真的
视频结束
来自视频v
左连接
用户视频
在uv.video_id=v.id上
但我又想到了一个问题:
如果我想显示特定类别的视频,该怎么办?
假设这是另一个多对多的关系
包含pivot videos\u categories的视频和类别表您可以在不使用
联合
和的情况下执行此操作,除了这样的
select distinct
v.*,
case
when uv.user_id is null or uv.user_id <> 1 then false
else true
end has_video
from videos v
left join
user_videos uv
on uv.video_id = v.id
您希望选择所有视频,并为每个视频说明用户1是否拥有它。因此,请从视频中选择并查找用户的视频:
select
v.*,
id in (select video_id from users_videos where user_id = 1) as has_video
from videos v;
添加一些示例表数据和预期的结果-所有文本都是格式良好的文本。这些右连接作为常规内部连接执行…使用示例数据和structureUpdated问题进行更新您的意思是过滤特定类别的结果吗?或者显示每个视频的所有类别?@stefanozanii我已经更新了我的问题,你能看一下吗?用改进的解决方案编辑谢谢@stefanozanii:)
select
v.*,
id in (select video_id from users_videos where user_id = 1) as has_video
from videos v;