我有一个用户表,视频表和动作表。当用户观看视频时,将同时创建具有其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。
答案 0 :(得分:1)
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
表过滤现有组合。