排除特定的SQL列?

时间:2016-07-28 02:46:07

标签: php mysql

我正在尝试SELECT某个用户(用户ID:uid)尚未被喜欢或不喜欢的随机网页。

我的表结构:

OneNight_pages :( id,title)OneNight_pages_likes :( id,page_id,uid,status)

这就是我试图获取随机页面的方式:

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_id还有其他喜欢和不喜欢的人) 。

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

1 个答案:

答案 0 :(得分: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”在likes表中没有行。

编辑:

您的查询的这种变体应该做同样的事情:

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;

以前的版本应该有更好的性能。