选择用户未观看的所有电影,并将结果限制为20

8fq7wneg  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(342)

我需要选择用户尚未观看的所有电影。
获取最后20部电影的sql查询如下所示:

SELECT movies.* FROM movies, hdd WHERE hdd.id=movies.hdd_id and hdd.status='1' and movies.skip!='1' order by id desc limit 20

电影表如下所示:

id  int(11) Incrément automatique    
hdd_id  int(20)  
tmdb_id int(20) NULL     
imdb_id text NULL    
file_path   text     
ftp_path    text NULL    
file_name   text     
resolution  text NULL    
timestamp   int(11) NULL     
skip    int(2)   
credits int(2)   
title   varchar(255) NULL    
original_title  varchar(255) NULL    
adult   int(2) NULL  
categ   text NULL    
collection  text NULL    
companies   text NULL    
language    text NULL    
lang    text NULL    
rating  text NULL    
mpaa    text NULL    
tagline text NULL    
overview    text NULL    
budget  text NULL    
homepage    text NULL    
popularity  text NULL    
runtime varchar(255) NULL    
revenue varchar(255) NULL    
release_date    date NULL    
vote_average    varchar(255) NULL    
vote_count  varchar(255) NULL    
movie_poster_path   varchar(255) NULL    
movie_poster    varchar(255) NULL    
movie_backdrop_path varchar(255) NULL    
movie_backdrop  varchar(255) NULL

只有当hdd状态为online并且爬虫程序没有跳过它时,才会选择电影。
现在的问题是,监视日志位于一个单独的表中:该表如下所示:

id  int(11) Incrément automatique    
type    varchar(255)     
ref int(9) NULL  
membre  int(9) NULL  
counter int(9) NULL  
duration    varchar(255)     
currentTime varchar(255)

membre是用户id,ref是电影tmdb\u id
这就是我所尝试的

SELECT movies.* FROM movies, hdd, watch WHERE hdd.id=movies.hdd_id and hdd.status='1' and movies.skip!='1' and (watch.membre='$_SESSION[id]' and watch.ref=movies.tmdb_id) order by id desc limit 20

但这当然行不通。我认为输出是反向的。它不是归还那些没人看的东西,而是归还那些看了的电影。

dw1jzc5e

dw1jzc5e1#

你需要的是 LEFT JOIN 观察并检查中是否没有匹配的条目 watch . 我认为这会奏效:

SELECT movies.* 
FROM movies
JOIN hdd ON hdd.id = movies.hdd_id AND movies.skip != 1
LEFT JOIN watch ON watch.ref = movies.tmdb_id AND watch.membre='$_SESSION[id]'
WHERE watch.id IS NULL
ORDER BY id DESC
LIMIT 20
az31mfrm

az31mfrm2#

或者,要使其保持相同的样式,而不使用联接(如果出于任何原因这是您的首选),也可以执行以下操作:

SELECT movies.*
FROM movies, hdd
WHERE hdd.id = movies.hdd_id and hdd.status = '1' and movies.skip != '1' and
      NOT EXISTS(SELECT 1 FROM watch WHERE watch.membre = '$_SESSION[id]' and watch.ref = movies.tmdb_id)
ORDER BY id desc
LIMIT 20
pgky5nke

pgky5nke3#

你需要从所有已经看过的电影列表中筛选电影。使用 left join 它可以被过滤。试试这个。

SELECT movies.* FROM movies left join watch on watch.ref=movies.tmdb_id, hdd 
WHERE hdd.id=movies.hdd_id and hdd.status='1'and movies.skip!='1' and
watch.membre = '$_SESSION[id]'
order by id desc limit 20

相关问题