【发布时间】:2017-08-25 17:34:38
【问题描述】:
我努力解决以下问题: 我的数据库中有 2 个表: 视频和 users_videos 作为视频和用户之间的枢纽(我从令牌接收 user_id,因此 users 表在另一个数据库中)
拥有一个用户 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
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
示例数据:
users_videos
| 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
------------------------------
@UPDATE --
使用@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
但我又想到了一个问题:
如果我想显示特定类别的视频怎么办? 假设这是另一个多对多关系
带有枢轴视频类别的视频和类别表
【问题讨论】:
-
添加一些示例表数据和预期的结果 - 以及所有格式化文本。
-
那些 RIGHT JOIN 执行为常规 INNER JOIN...
-
更新了样本数据和结构
-
更新问题
-
您的意思是过滤特定类别的结果吗?还是显示每个视频的所有类别?
标签: sql postgresql many-to-many