始终进行一次数据库查询的最有效方法是什么,我知道该查询只会偶尔返回结果?

问题描述

| 我正在尝试找出如何在我的网站上实施一项新功能。我的网站允许人们下载一组成员上传内容。新功能将允许该组的1个成员成为“超级”用户,无法上传其上载内容。因此,目前我的查询(或多或少)是-
SELECT * FROM uploads WHERE group = $groupid
我在想将成员的“超级”状态存储在“成员”表中,因此在执行查询之前可能会查找此信息以获得超级成员的成员ID。
$all_group_members = SELECT members FROM groups WHERE group_id = $groupid
$super_member = SELECT memberid FROM members WHERE memberid IN ($all_group_members) AND super_status = 1 
然后将查询修改为-
SELECT * FROM uploads WHERE group = $groupid AND uploader ! = $super_member
但是,在组中可能并不总是有超级成员,所以我的问题是是否有更有效的方法来做到这一点,例如将超级成员ID存储在会话cookie中?如何将超级用户ID存储在组表中-仍然涉及执行查询-
SELECT super_user FROM groups WHERE groupid = $group_id 
但是,至少要少一个查询。 难道这没有办法-我知道大约只有5%的时间会有一个超级用户,因此95%的时间将浪费查询。可能会话cookie可以存储group_has_super_user变量。 还有其他方法可以做到吗? 谢谢     

解决方法

我认为,其他小组成员无法从小组内容中下载任何内容。因此,只需将可下载字段添加到上传文件中,并将其设置为 1,如果一个简单的成员上传了它,或者 0,如果超级会员拥有。 然后,您唯一需要运行的查询是:
SELECT * FROM uploads WHERE group = $groupid AND downloadable != 0
另外,如果成员资格正在更改(例如,其他人获得了超级权限),则应在组中重新计算这些标志。 不要忘记为groupid +可下载(或可下载+ groupid)创建索引(或将主键设置为index)!     ,
CREATE TABLE uploads (id,user_id,…)
CREATE TABLE groups (id,…)
CREATE TABLE group_users (group_id,is_super,…)

SELECT  u.*
FROM    group_users gu
JOIN    uploads u
ON      u.user_id = gu.user_id
WHERE   gu.group_id = $group_id
        AND gu.is_super = 0
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...