我通过这些表格中的喜欢和不喜欢保存兴趣:pages
,pages_likes
,pages_dislikes
现在我希望有一个主页面来显示随机页面,但只有那些未被特定用户喜欢或不喜欢的页面。
到目前为止我有这个SQL语句:
SELECT
p.id AS page_id, d.uid AS duid, l.uid AS luid,p.title FROM OneNight_pages p
LEFT JOIN OneNight_pages_dislikes d on d.page_id = p.id
LEFT JOIN OneNight_pages_likes l on l.page_id = p.id
WHERE
l.uid != 1 AND d.uid != 1
GROUP BY page_id
ORDER BY rand() LIMIT 10
我首先在没有AND d.uid != 1
的情况下对此进行了测试,并得到了正确的结果。但在添加此AND条件后,我得到了错误的结果。他只会选择一个喜欢和不喜欢的页面,而不是像我想的那样过滤掉这个特定的用户ID。
如何为喜欢和不喜欢排除特定的用户ID?我想需要一个子查询或什么?
答案 0 :(得分:1)
您没有提供表格结构,数据样本和预期结果,所以说实话,您的问题不是很明确。
我猜这就是你想要的:
SELECT p.id AS page_id, p.title
FROM OneNight_pages p
LEFT JOIN OneNight_pages_dislikes d ON (d.page_id = p.id AND d.uid = 1)
LEFT JOIN OneNight_pages_likes l ON (l.page_id = p.id AND l.uid = 1)
WHERE l.uid IS NULL AND d.uid IS NULL
GROUP BY page_id
ORDER BY rand()
LIMIT 10
如果这确实是您想要的,并且如果一个用户只能喜欢或不喜欢每个页面一次(即如果您的主键是(page_id, uid)
),那么GROUP BY
可能是不必要的
另外作为旁注,除非您的用户两者同时喜欢和不喜欢某个页面,否则只有一个表likes
的字段更合理表示它是喜欢还是不喜欢(例如" 1"喜欢" -1"喜欢不喜欢)。