2016-07-28 56 views
5

我正在尝试SELECT尚未被某个用户(user-id:uid)所喜欢或不喜欢的随机页面。排除特定的SQL列吗?

我的表结构:

OneNight_pages:(ID,标题)OneNight_pages_likes:(ID,PAGE_ID,UID状态)

这就是我如何试图得到一个随机页面:

SELECT 
p.id AS page_id, 
p.title, 
SUM(CASE WHEN l.page_id = p.id AND status = '1' THEN 1 ELSE 0 END) AS likes, 
SUM(CASE WHEN l.page_id = p.id AND status = '0' THEN 1 ELSE 0 END) AS dislikes 

FROM OneNight_pages_likes l 
LEFT JOIN OneNight_pages p on l.page_id = p.id 
WHERE l.uid != '1' 
GROUP BY page_id 
ORDER BY rand() 
LIMIT 1 

但是,这仍然会显示我已经喜欢或不喜欢的页面,因为WHERE l.uid != 1不会影响排除整个l.page_id(因为对于特定的page_i,还有其他类似的和不喜欢的人) d)。

我想我需要解决这个与子查询首先接收页面ID或使用一些特定的算法?我还想过将所有喜欢和不喜欢的页面作为数组存储在cookie或会话中,但我不知道这是否是正确或有效的方式?

+0

你能提供样本数据和预期结果吗?难以理解... – sgeddes

回答

4

这是你想要的吗?

select p.* 
from OneNight_pages p 
where not exists (select 1 
        from OneNight_pages_likes l 
        where l.page_id = p.id and l.uid = '1' 
       ) 
order by rand() 
limit 1; 

这将选择一个随机页面,用户“1”在类似表格中没有行。

编辑:

上查询这种变化应该做的是同一件事:

SELECT p.id AS page_id, p.title, 
     SUM(CASE WHEN status = '1' THEN 1 ELSE 0 END) AS likes, 
     SUM(CASE WHEN status = '0' THEN 1 ELSE 0 END) AS dislikes 
FROM OneNight_pages p LEFT JOIN 
    OneNight_pages_likes l 
    ON l.page_id = p.id 
GROUP BY page_id 
HAVING SUM(l.uid = 1) = 0 
ORDER BY rand() 
LIMIT 1; 

以前的版本应该有更好的表现。

+0

谢谢您的回复。这似乎只显示现在还没有被人喜欢的页面。因此,我只能获得没有任何喜欢或不喜欢的网页,而不是只排除一个特定的用户? – AlexioVay

+1

@Vaia。 。 。这应该只排除一个特定用户的喜好。 –

+1

你是对的,谢谢!我使用了'l.uid!='1''而不是'l.uid ='1'' – AlexioVay