使用使用mysql
而不是mysqli/pdo
的遗留代码,所以不用担心这个,我稍后会更新这个查询。
尽管我当前的方法有效,但我确信有一种更简洁的方法可以完成此操作,而不是使用查询和 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/