【问题标题】:How to do SQL's GROUP BY using PHP?如何使用 PHP 做 SQL 的 GROUP BY?
【发布时间】:2012-10-19 06:10:30
【问题描述】:

我想从数据库表中选择行并使用 PHP 而不是基于参数的 SQL 对它们进行分组(在本例中是按项目)。

SQL:

Clothes table

 id  item     owner
 1   shoes     joe 
 2   pants     joe
 3   hat       joe
 4   pants     joe
 5   hat       tom

SELECT * from Clothes where owner='joe'

 1   shoes     joe 
 2   pants     joe
 3   hat       joe
 4   pants     joe

这是我希望使用 PHP 而不是 SQL 的 GROUP BY item 来处理结果的方式@

PHP:

 1   shoes     joe 
 2   pants     joe   //count 2
 3   hat       joe

我确定有一个 PHP 数组函数我只是不熟悉,想法?

【问题讨论】:

  • 请问你为什么要在php中做这个?
  • 与使用 PHP 解决方案相比,SQL 将更高效且引起的麻烦更少。我从经验中知道这一点,因为我在使用多维数组之前尝试了类似的东西 - stackoverflow.com/questions/12318052/…
  • @JonathanKuhn @jasper 我到group by 的实际数据是按日期计算的。我想做一个查询来获取用户的所有项目,然后将它们显示为按日期分组以及显示它们未分组。如果我使用 SQL 执行group by,我将丢失单个项目并且数据将被聚合,我将不得不执行 2 个 SQL 查询。

标签: php sql arrays group-by grouping


【解决方案1】:
function group($items, $field) {
    $return = array();

    foreach ($items as $item) {
        $key = $item[$field];

        if (isset($return[$key])) {
            $return[$key]['count']++;
        } else {
            $return[$key] = $item;
            $return[$key]['count'] = 1;
        }
    }

    return $return;
}

print_r(group($results, "item"));

【讨论】:

    【解决方案2】:

    最简单的方法是利用数组键的唯一性:

    $grouped = array();
    
    while ($row = $db->fetchResult()) {  // or however you get your data
        if (isset($grouped[$row['item']])) {
            $grouped[$row['item']]['count']++;
        } else {
            $grouped[$row['item']] = $row + array('count' => 1);
        }
    }
    

    【讨论】:

    • 感谢您的回答,您能简要解释一下这段代码在做什么吗?另外,我可以使用 foreach 循环而不是 while 循环吗?
    • 当然,您可以使用任何类型的循环。 “魔法”就在$grouped[ $row['item'] ]。它获取每行的item 值并将其用作新$grouped 数组的索引。具有相同item 的行将落在相同的索引上。在这种情况下,我们只需增加一个计数器。
    • 可以加一个$index++来避免:Notice: Undefined index
    【解决方案3】:

    对数据库访问功能使用伪代码,我相信这应该可行:

    $sql = "SELECT * from Clothes where owner='joe'";
    $res = query($sql);
    $arr = array();    
    
    while ($row = $res->fetch())
    {
        $arr[] = $row['item'];
    }
    
    $arr = array_unique($arr);
    

    您应该注意,这可能会给您一个“稀疏数组”(换句话说,键中可能存在间隙)。正如 cmets 中所说,如果您有该选项,通常最好在 SQL 中执行此操作。即使这意味着执行两个类似的查询。

    【讨论】:

    • -@jasper 谢谢,为什么两个相似的 SQL 查询优于 1 个查询然后在 PHP 中解析结果?
    • 你让我呆了一秒钟,我回答是因为我被教导要这样工作,而不是因为我确切地知道为什么会这样。然而,在考虑之后,一个原因可能是,一旦你想要存储更多信息,而不是像我在这里做的那样按属性排序,它变成了更容易出错的代码。另一个原因是,虽然两次查询可能会因为双磁盘访问而花费更长的时间,但它会更有效地进行排序(如果给定正确的索引等等),并且如果缓存正确,则可能不需要双磁盘访问。
    • ...[cont'd] 最后,一旦正确设置,您不应该对数据库的效率进行第二次猜测。它可以(并且将会)进行大量优化,这意味着您的猜测几乎总是不正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    相关资源
    最近更新 更多