Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用“选择多对多关系”;拥有;柱_Sql_Postgresql_Many To Many - Fatal编程技术网

Sql 使用“选择多对多关系”;拥有;柱

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

我努力解决以下问题: 我的数据库中有两个表: 视频和用户\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 
 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;