php - 排除特定的 SQL 列?

标签 php mysql

我正在尝试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/

相关文章:

php - 如何在eclipse中生成getter和setter (php)

php - Magento 类别产品重新索引错误

php - 类似mysql结构的数据透视表

php - 我如何重定向表数组以在 php 中显示其值

mysql - 在数据库 : do I miss some drawbacks in this particular situation? 中存储二进制文件

php - 我可以在 Codeigniter 上使用两个 mysql 用户吗?

php - Zend_Db : fetchAll() or query()/fetch() for a huge number of records

php - 将图像与文本合并

php - 从php和mysql如何在html文件中加载和插入数百万条记录

mySQL - 如何展平记录和子记录