Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如果我知道数据库查询只会偶尔返回结果,那么最有效的方法是什么?_Php_Mysql_Session Variables - Fatal编程技术网

Php 如果我知道数据库查询只会偶尔返回结果,那么最有效的方法是什么?

Php 如果我知道数据库查询只会偶尔返回结果,那么最有效的方法是什么?,php,mysql,session-variables,Php,Mysql,Session Variables,我正在努力研究如何在我的网站上实现一项新的功能。我的网站允许人们下载一组成员上传的东西。新功能将允许组中的一名成员成为无法下载上载内容的“超级”用户。所以现在我的问题(或多或少)是- 我想我会在“members”表中存储成员的“super”状态,因此在执行查询之前,我可能会查找它以获取超级成员的成员id $all_group_members = SELECT members FROM groups WHERE group_id = $groupid $super_member = SELECT

我正在努力研究如何在我的网站上实现一项新的功能。我的网站允许人们下载一组成员上传的东西。新功能将允许组中的一名成员成为无法下载上载内容的“超级”用户。所以现在我的问题(或多或少)是-

我想我会在“members”表中存储成员的“super”状态,因此在执行查询之前,我可能会查找它以获取超级成员的成员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可以存储一个组\u has\u super\u user变量

还有其他我不知道的方法吗


谢谢

我想,其他群成员无法从我的群中下载任何东西。因此,只需在上传中添加一个可下载字段,并将其设置为

  • 1,如果简单成员已上载,或
  • 0,如果超级成员具有
那么您必须运行的查询只有:

SELECT * FROM uploads WHERE group = $groupid AND downloadable != 0
此外,如果成员身份正在更改(例如,其他人获得超级权限),则应在组中重新计算这些标志


不要忘记为groupid+downloadable(或downloadable+groupid)创建索引(或将主键设置为主键)

+1但答案不完整,因为没有一些描述词。请解释一下将主键设置为groupid+downloadable好吗?为什么这很重要?感谢如果不创建密钥,SQL server必须进行完整的表扫描:它会检查每条记录的条件。为表编制索引时,SQL server会创建一些索引文件(您看不到),用于按排序顺序而不是随机顺序列出记录。因此,使用索引,SQL server可以快速找到第一条匹配记录,并在找到第一条不匹配记录时停止扫描。你可以自己试试:把联系人的名字按随机顺序列成一个列表,另一个按字母顺序列成一个列表,然后试着在两种情况下找到一个人:全表扫描和二进制搜索。哪个更快?
CREATE TABLE uploads (id, user_id, …)
CREATE TABLE groups (id, …)
CREATE TABLE group_users (group_id, user_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
SELECT * FROM uploads WHERE group = $groupid AND downloadable != 0