MySQL select 有关系和无关系的行

MySQL select row with and without relation

假设我有 2 mysql tables 'movies' 和 'seen'

如果用户已经看过电影,'seen' table 中会有一条记录,其中包含他的用户 ID 和电影 ID

我必须打印 所有 电影,然后如果用户已经看过电影打印 "already watched" 否则 "to watch".

此时我将 PHP 与 2 个单独的查询一起使用:

<?php
$res = mysql_query( "SELECT * FROM movies" );
while( $row = mysql_fetch_assoc( $res ) ) {
  echo $row['movie_name'];
  $res2 = mysql_query( "SELECT * FROM seen WHERE userID = '$uid' AND movieID = '$row[id]' LIMIT 1" );
  if( mysql_num_rows( $res2 ) == 1 ) { echo "already watched"; } else { echo "to watch"; }
}

有一种方法可以通过一个查询来做到这一点吗?

在 "movies.id = seen.movieID" 上使用 JOIN 它只打印观看的电影,使用 "WHERE movies.id NOT IN ( SELECT seen.movieID FROM seen WHERE seen.userID = '$uid' )" 它只打印未观看的..

您可以创建一个子查询来聚合用户看过电影的次数:

SELECT m.userid, m.movieid, 
  case when s.seencount is null then 0 else 1 end as seenmovie
FROM movies m left join 
    (SELECT movieid, userid, count (id) 
    FROM seen
    GROUP BY movieid, userid) as s on m.movieid = s.movieid and m.userid = s.userid 

这还将处理用户多次观看电影的情况

我在移动设备上,如果有任何打字错误,我深表歉意,但你应该明白了

SELECT * FROM `movies` 
LEFT JOIN ( select movieName,'Watched' as w from seen where userId='$uid' ) s 
on s.movieId=movies.movieId 

看电影时会给出watched,否则会给出NULL

在这种情况下,您可以使用 from LEFT JOIN,在左联接中,您可以看到第一个 table 而不是第二个 table 的数据。

SELECT * FROM movies LEFT JOIN seen ON movies.id = seen.movieID

如果看到的数据 table 在结果数据上存在,如果不是用户没有看到。

您也可以在解决方案中使用 UNION 并合并到查询