php - 如何以更简洁的方式执行这些 MySQL 子查询?

标签 php mysql mysqli

使用使用mysql而不是mysqli/pdo的遗留代码,所以不用担心这个,我稍后会更新这个查询。

尽管我当前的方法有效,但我确信有一种更简洁的方法可以完成此操作,而不是使用查询和 3 个子查询。我主要想了解如何更好地增强查询并最大程度地减少查询量。
我想做的是

  1. 回显每个日期的所有数据,日期显示在顶部
  2. 在用户旁边显示该特定日期每个用户的条目数
  3. 对于每个日期,在上述 2 位数据的底部,显示条目数最多的用户

    $query = mysql_query('SELECT * FROM entries GROUP BY DATE(dt)');
    
    $g = 0;
    
    while ($row = @mysql_fetch_array($query)) 
    {
    
        $group[$g] = date('y-m-d', strtotime($row['dt']));
        echo $group[$g] . "<br />";
    
        //display the person's name for today with their count
        $dayquery = mysql_query('SELECT *, COUNT(username) as total FROM entries WHERE DATE(dt) = "'.$group[$g].'" GROUP BY username ORDER BY COUNT(username) DESC');
            while ($today = @mysql_fetch_array($dayquery)) 
            {
                echo $today['first_name'] . " | " . $today['total'] . "<br />";
            }   
    
            //display the highest count for today
            $topquery = mysql_query('SELECT COUNT(username) as highest FROM entries WHERE DATE(dt) = "'.$group[$g].'" GROUP BY username ORDER BY COUNT(username) DESC LIMIT 1');
                while ($toptoday = @mysql_fetch_array($topquery)) 
                {
                    echo "Highest today: " . $toptoday['highest'] . "<br /><br />" ;
                } 
    
                //display the users with the highest count for today
                echo "Highest users: ";
                $userstopquery = mysql_query('SELECT *, COUNT(username) as total FROM entries WHERE DATE(dt) = "'.$group[$g].'" AND COUNT(username) = "' . $toptoday['highest'] . '" AND GROUP BY username');
                    while ($topusers = @mysql_fetch_array($userstopquery)) 
                    {
                         echo $topusers['first_name'] . "<br />" ;
                    } 
    
        $g++;
    
    }
    

我遇到的麻烦是,当我尝试减少这些子查询并使用 MAX 时,它只会输出最高计数,而不是每个日期的所有数据,这正是我所需要的,包括当天条目数量最多的用户的输出。

最佳答案

你可以从这样的事情开始。请注意,我没有使用 PHP mysql API,因为它在 3 或 4 年前已被弃用...

require('path/to/mysqli/connection/stateme.nts');

$array = array();

$query = "
SELECT e.dt
     , e.username
     , COUNT(*) ttl
  FROM entries e
 GROUP
    BY e.dt
     , e.username
 ORDER 
    BY e.dt, ttl DESC;
";


$result = mysqli_query($conn,$query);

while ($row = mysqli_fetch_assoc($result)) 
        {
            $array[] = $row;
        }

print_r($array);

关于php - 如何以更简洁的方式执行这些 MySQL 子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30013446/

相关文章:

php - MYSQL 查询同一字段两次

javascript - 如果下拉菜单改变,金额也会改变 PHP+JS

mysql - 删除重复条目mysql

php - 使用while循环将mysql行放入变量中

php - 使用 PDO 将 polymer 数据绑定(bind)到 MySQL 表数据

php - 使用PHP在mysql中插入数据时返回最后一个id

php - mysqlnd 没有 mysqli_stmt_get_result()

php - 隐藏第一个按钮 onclick 显示第二个按钮,隐藏第二个 onclick 显示第一个按钮

php - 从特定数据库读取所有记录并打印它们的最佳方法是什么?

php - 如何在提交之前使用 jquery ajax 验证表单?