2012-02-23 45 views
2

已登錄的用戶有userid = 8。我希望查詢返回產品表中的所有行,但如果userid = 8已投票,則不顯示類似或不喜歡的代碼。JOIN不檢索行

在下面的查詢中沒有行被返回。我不應該在投票表中插入每個用戶標識(每個產品的用戶太多)。什麼是正確的方法來做到這一點?

$query= mysql_query("SELECT rate.voted as rvote, child.* FROM products child JOIN vote rate on child.id=rate.parentid WHERE rate.userid='8'") or die(mysql_error()); 

投票表

id | parentid | userid | voted | 
1 | 1  |  6 | 1  | 
2 | 2  |  6 | 1  | 
3 | 1  |  4 | 1  | 
4 | 3  |  6 | 1  | 

產品表

id |  name  | 
1 |  bottled | 
2 |  grain | 
3 |  milk  | 
4 |  bread | 

PHP

while($row=mysql_fetch_assoc($query)) { 
$name = $row['name']; 
$vote = $row['rvote']; 

    echo $name; 

    if($vote!=1) { 
//like or dislike code 
} 



} 

回答

2

下面介紹如何返回用戶8結果,使用JOIN

SELECT v.voted, p.* 
FROM product p 
LEFT JOIN vote v 
    ON v.userid = 8 
    AND v.parent_id = p.id 

voted1對於被否決的產品,否則NULL

隨着對產品表和與所述列(userid, parent_id)vote表多列索引的id列的索引,它應該是相當迅速。

0
select * from products 
where id not in (select parentid from vote where userid = 8); 
0

該查詢會給你期望的結果:

select * from product where id not in (select id from vote where userid =8 and (voted = 0 || voted =1)) 
+0

它應該是'...(從投票中選擇parentid ...「。另外,如果這些值只是可能值,則'和(voteed = 0 || voteed = 1)'不是必需的。 – Furgas 2012-02-23 19:40:18