2016-05-21 52 views
3

讓說我有2 MySQL表「電影」和「看到」MySQL的選擇一行並沒有關係

如果用戶已經看了一部電影沒有在「看到」表中的記錄,他的用戶ID和電影ID

我必須打印所有電影,然後如果用戶已經看到電影打印「已經看過」,否則「看」。

這時我使用PHP與2個seprate查詢:

<?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"; } 
} 

有一種方法做一個單一的查詢?

隨着JOIN的 「movies.id = seen.movi​​eID」 它只能打印wahtched電影,與「WHERE movies.id NOT IN(SELECT seen.movi​​eID FROM在哪裏見過seen.userID = '$ UID') 「它只能打印沒有看過..

+0

我們只是不再這樣做。停止使用PHP的mysql_ API – Strawberry

回答

1

在這種情況下,你可以使用左JOIN,在左連接中,您可以看到第一個表上的數據,但不在第二個表上。

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

如果看到的表的數據在結果數據上存在,如果沒有用戶沒有看到。

您也可以在您的解決方案中使用UNION併合並查詢

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
SELECT * FROM `movies` 
LEFT JOIN (select movieName,'Watched' as w from seen where userId='$uid') s 
on s.movieId=movies.movieId 

會給觀看影片時觀看時,否則會給NULL