我正在尝试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或会话中的数组,但我不知道这是否是正确或有效的方式?
答案 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;
以前的版本应该有更好的性能。