在SQL查询中排除喜欢和不喜欢的页面?

时间:2016-07-27 14:25:53

标签: mysql

我通过这些表格中的喜欢和不喜欢保存兴趣:pagespages_likespages_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?我想需要一个子查询或什么?

1 个答案:

答案 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"喜欢不喜欢)。