问题:如何创建一个while循环,列出唯一名称以及该名称在数据库中列出的次数?
我永远不知道在任何给定时间将在数据库中列出哪些名称,因此我无法对其进行硬编码。
Date + Place
| id | name | age |
| 1 | Bob | 35 |
| 2 | Jake | 30 |
| 3 | Bob | 25 |
| 4 | Bob | 45 |
| 5 | Jake | 78 |
| 6 | Heather | 23 |
$query = $con->query("SELECT id,name,age FROM table order by name ASC")
if ($query->num_rows > 0) {
while ($result = $query->fetch_assoc()) {
// while loop
}
}
我不知道这是否是while循环中的php代码,或者如果这是一个特定的查询我可以运行来实现这一点。任何帮助将不胜感激。
答案 0 :(得分:6)
您可以在SQL查询中执行此操作...
$query = $con->query("SELECT name, count(id) as total
FROM table
group by name
order by name ASC")
使用count(id)将按名称计算组内id的数量。
<强>更新强> 另一个答案为您提供了一种在for循环中执行此操作的方法。但另一个版本是你做的事......
$query = $con->query("SELECT id,name,age FROM table order by name ASC")
if ($query->num_rows > 0) {
$data = $query->fetch_all(MYSQLI_ASSOC);
$names = array_column($data, 'name');
$count = array_count_values($names);
print_r($count);
}
这只是从SQL语句中获取所有数据,然后提取名称列并计算此数组中的唯一值。
答案 1 :(得分:1)
虽然我通常会使用GROUP_BY
和COUNT()
在SQL中执行此操作 - 如果您需要在PHP中执行此操作,则可以使用以下方法之一。
假设您有以这种形式的数据:
$data = [
['id' => 1, 'name' => 'Bob', 'age' => 35],
['id' => 2, 'name' => 'Jake', 'age' => 30],
['id' => 3, 'name' => 'Bob', 'age' => 25],
['id' => 4, 'name' => 'Bob', 'age' => 45],
['id' => 5, 'name' => 'Jake', 'age' => 78],
['id' => 6, 'name' => 'Heather', 'age' => 23],
];
一种方法是:
$counts = [];
foreach ($data as $row) {
if (isset($counts[$row['name']])) {
$counts[$row['name']] += 1;
} else {
$counts[$row['name']] = 1;
}
}
这是另一个,这是(恕我直言)更优雅,但更慢:
$groups = [];
foreach ($data as $row) {
$groups[$row['name']][] = $row;
}
$counts = array_map('count', $groups);
两种方法都会创建一个这样的数组:
[
'Bob' => 3,
'Jake' => 2,
'Heather' => 1,
];
演示:http://rextester.com/PTCC84943
foreach循环也可以用while ($row = $query->fetch_assoc())