MySQL选择有和没有关系的行

时间:2016-05-21 07:43:38

标签: php mysql subquery

假设我有2个mysql表'电影'和'看过'

如果用户已经看过电影,则“看到”表格中有一条记录,其中包含用户ID和movieID

我必须打印所有电影,然后如果用户已经看过电影打印“已经看过”,否则“要观看”。

此时我使用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.movi​​eID”上的JOIN,它只会打印出已经播出的电影,其中包含“WHERE movies.id NOT IN(SELECT seen.movi​​eID FROM FROM WHERE seen.userID ='$ uid') “它只打印未观看的内容..

3 个答案:

答案 0 :(得分:1)

您可以创建一个子查询,汇总用户看过电影的次数:

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 

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

我在移动设备上如果有任何拼写错误而道歉,但你应该明白这个想法

答案 1 :(得分:1)

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

观看电影时会看电视,否则会给出空白

答案 2 :(得分:1)

在这种情况下,您可以使用LEFT JOIN,在左连接中,您可以看到首先在桌面上的数据,而不是在第二个表格上。

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

如果看到的表的数据是否存在,如果用户没有看到,则存在结果数据。

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