【问题标题】:Exclude a specific SQL column?排除特定的 SQL 列?
【发布时间】:2016-07-28 02:46:06
【问题描述】:

我正在尝试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 或会话中,但我不知道这样做是否正确或有效?

【问题讨论】:

  • 您能提供样本数据和预期结果吗?难以理解...

标签: php mysql


【解决方案1】:

这是你想要的吗?

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;

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

【讨论】:

  • 感谢您的回复。这似乎只显示现在根本不被喜欢的页面。所以我只得到没有任何喜欢或不喜欢的页面,而不是只排除一个特定用户?
  • @Vaia 。 . .这应该只排除一个特定用户的喜欢。
  • 你是对的,谢谢!我使用l.uid != '1' 而不是l.uid = '1'
  • 抱歉,再次打扰您,但您能否更新您的答案,同时包含对随机选择的页面的喜欢和不喜欢的计数?我在我的问题中将它与 SUM 一起使用。当我将它包含在子查询中时,我的结果是空的。
  • @Vaia 。 . . where 子句中的子查询不能返回列值。它只能用于过滤。
猜你喜欢
  • 2021-09-10
  • 2012-03-10
  • 2016-12-23
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2013-05-31
相关资源
最近更新 更多