【问题标题】:Concatenate mysql column values in php在php中连接mysql列值
【发布时间】:2016-07-12 00:34:13
【问题描述】:

我有一张这样的桌子:

client_id   |   name   |   bank_name
------------------------------------
    1       |   Steve  |    Bank 1 
    1       |   Steve  |    Bank 1
    1       |   Steve  |    Bank 3

我想打印如下声明:

Client: Steve

Current bank: Bank 1, Bank 3

这是我当前的代码。 (请记住,我在模板 pdf 中打印此内容,因此请忽略 php 和 div 标签,它们是正确的。):

<?php
    $currentBank = '';
    foreach($data as $bank){
        $currentBank .= $bank->bank_name;

?>
            <div>Current bank: {{ $currentBank }} </div>
<?php
    }
?>

谁能帮我实现想要的格式,忽略重复的项目并以格式打印出来:'Bank 1,Bank2'。

目前使用我的代码,我的输出是:

Current bank: Bank1
Current bank: Bank1Bank1
Current bank: Bank1Bank1Bank3

注意:我不能在我的 sql 查询中使用DISTINCT,因为模板的另一部分要求我打印出包括重复项在内的所有内容

【问题讨论】:

  • GROUP_CONCAT怎么样?
  • 请注意,您不应该在服务器端进行这种处理。如果您想以不同的方式显示相同的数据怎么办?你是要执行另一个查询,还是只操作 DOM?
  • @Strawberry 所以你是说数据库中每个人的名字都永远是史蒂夫
  • 我的意思是,虽然名字是 steve,但做一件事。当它改变时,做其他事情。这是循环中的基本操作。
  • @Strawberry 这并不能解决问题。

标签: php html mysql sql angularjs


【解决方案1】:

你的问题在 SQL 中的答案是:

select name, group_concat(distinct bank_name)
from t
group by name;

我不明白它如何适合您的应用程序的其余部分。我可以说您应该在数据库中进行此处理,而不是在应用程序端使用循环。

【讨论】:

    【解决方案2】:

    您可以在 SQL 中做到这一点:

    SELECT name, GROUP_CONCAT(DISTINCT bank_name) FROM table GROUP BY client_id;
    

    【讨论】:

    • 这需要在 php 中完成,因为数据集在文档的其他地方使用。这也不会忽略重复项。
    • @st3lz 添加了DISTINCT 来管理重复项。关于数据集:只查询一个数据集,只针对这个列表。
    【解决方案3】:

    您需要花费整个 for 循环遍历所有可用数据。将名称收集到一个新数组中,因为这使我们可以轻松地使用 array_unique 获取唯一性。另一种选择是将银行名称存储为数组中的键 - 参见第二个示例

    <?
        $currentBank = '';
        $bankNameList = [];
        foreach($data as $bank):
            $bankNameList[] = $bank->bank_name;
        }
        $bankNameList = array_unique($bankNameList);
        $currentBank = implode(', ', $bankNameList);
    
    ?>
                <div>Current bank: {{ $currentBank }} </div>
    <? endfor; ?>
    

    第二个没有array_unique()的例子

    <?
        $currentBank = '';
        $bankNameList = [];
        foreach($data as $bank):
            $bankNameList[$bank->bank_name]++;
        }
        $currentBank = implode(', ', array_keys($bankNameList));
    
    ?>
                <div>Current bank: {{ $currentBank }} </div>
    <? endfor; ?>
    

    最好的方法是使用命名的辅助函数在模板之外组织这些数据。这样,您的模板就不会增长到数千行未记录的行

    <?
    
    /**
     * Return all $item->bank_names
     * as comma delimited string
     */
    public function concatAllBankNames($data) {
    
            $bankNameList = [];
            foreach($data as $bank):
                $bankNameList[$bank->bank_name]++;
            }
            return implode(', ', array_keys($bankNameList));
    }
    
    //.. in some controller
    foreach ($databasedata as $row) {
      $row[ $row['username'] ]['bank_names_concat'] = $this->concatAllBankNames($row['data']);
    
    }
    //assign data to template system somehow
    $template->rows = $rows;
    //or
    $template['rows'] = $rows;
    

    【讨论】:

    • 谢谢,这就是我要找的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多