未被其他表访问的记录

时间:2019-08-07 14:53:30

标签: database postgresql

我有一个用户表,视频表和动作表。当用户观看视频时,将同时创建具有其ID和一些信息的动作记录。我想让X用户无法访问的Y视频。

用户表

void main(){
    try{

       work1();

       std::thread joinableThread(
           [](){
               work2();
           }
       );

       work3();

       throw std::runtime_error("catch me if you can");

       joinableThread.join();

    } catch(const std::runtime_error& ex){
       std::cout << "You did it!" << std::endl;
    }
}

视频表

|---------------------|------------------|---------------------|
|         ID          |       Name       |      account_id     |
|---------------------|------------------|---------------------|
|          1          |       user 1     |         1           |
|---------------------|------------------|---------------------|
|          2          |       user 2     |         1           |
|---------------------|------------------|---------------------|
|          3          |       user 3     |         1           |
|---------------------|------------------|---------------------|

动作表

|---------------------|------------------|---------------------|
|         ID          |       Name       |     account_id      |
|---------------------|------------------|---------------------|
|          1          |       video 1    |         1           |
|---------------------|------------------|---------------------|
|          2          |       video 2    |         1           |
|---------------------|------------------|---------------------|
|          3          |       video 3    |         1           |
|---------------------|------------------|---------------------|

所需的输出:

|---------------------|------------------|---------------------|
|         user_id     |       video_id   |     account_id      |
|---------------------|------------------|---------------------|
|          1          |       3          |         1           |
|---------------------|------------------|---------------------|
|          1          |       2          |         1           |
|---------------------|------------------|---------------------|
|          3          |       1          |         1           |
|---------------------|------------------|---------------------|
|          3          |       2          |         1           |
|---------------------|------------------|---------------------|

编辑:我认为值得一提的是,还有一个外键附加到名为account_id的所有列上。对于该示例,我们假设它们都具有相同的account_id。

1 个答案:

答案 0 :(得分:1)

demo:db<>fiddle

SELECT
    u.name,
    v.name
FROM
    users u CROSS JOIN videos v
WHERE (u.id, v.id) NOT IN (
     SELECT user_id, video_id FROM actions
)

注意:此预期结果似乎非常不方便。在更大的数据集上,您可能会得到非常大的输出!

首先,您必须创建一个CROSS JOIN,将每个user记录再联接一次,再将每个video记录联接起来。之后,您可以使用action表过滤现有组合。