【问题标题】:How to avoid doing a query each time loop runs? (optimize code)如何避免每次循环运行时进行查询? (优化代码)
【发布时间】:2014-09-20 07:35:12
【问题描述】:
$query = $db->query("SELECT * 
                     FROM users 
                     ORDER BY username ASC");
while($user = $query->fetch_object()) {
$if_inside = $db->query("SELECT member_id 
                         FROM project_members 
                         WHERE member_id='$user->id' 
                         UNION 
                         SELECT admin_id 
                         FROM project_admins 
                         WHERE admin_id='$user->id'")->num_rows;
if($if_inside < 1) { // if not already in project 
?> 
<option value="<?php echo $user->username; ?>"> 
               <?php echo $user->username; ?> </option>
 <?php
 } 
 }
 ?>

如何优化上面的代码?如果我的数据库中有 100 个用户,那么它会查询 100 次,而且它已经很慢(我有 2 个用户)

有没有更好的方法来检查用户是否已经在项目中?

【问题讨论】:

  • 为什么不从项目中获取所有用户,然后针对所述用户的id 运行它们以查看他们是否在项目中?或者你可以做一些JOIN
  • 我必须从project_membersproject_admins 获取所有用户,这就是我使用UNION 的原因。我将如何将从查询中收到的两个值匹配到用户 ID?

标签: php mysql sql optimization


【解决方案1】:

我想这就是你要找的东西:

$sql = $db->query("Select distinct username from users where username not in (select member_id from project_members union select admin_id from project_admins) order by username ASC");
$queryResult = $sql->fetch_all();

foreach($queryResult as $username) {
    echo "<option value='" . $username . "'>" .  $username . "</option>";
}

对数据库中所有不在 project_members 或 project_admins 中的用户名进行一次点击,然后对要显示的结果进行 foreach。

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 2019-11-17
    • 2019-04-07
    • 1970-01-01
    • 2018-07-31
    • 2019-05-26
    • 2015-05-31
    • 2022-11-23
    • 2021-03-21
    相关资源
    最近更新 更多