php while循环,列出唯一条目并计算每个条目的总数

时间:2018-03-15 19:16:46

标签: php mysql

问题:如何创建一个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代码,或者如果这是一个特定的查询我可以运行来实现这一点。任何帮助将不胜感激。

2 个答案:

答案 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_BYCOUNT()在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())

重新复制