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 并合并到查询
假设我有 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 并合并到查询