我正在尝试SELECT
特定用户(用户 ID:uid
)尚未喜欢或不喜欢的随机页面。
我的表结构:
OneNight_pages
:(id,标题)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 或 session 中,但我不知道这样做是否正确或有效?
最佳答案
这是你想要的吗?
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;
以前的版本应该有更好的性能。
关于php - 排除特定的 SQL 列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38626293/