在php中连接mysql列值

时间:2016-03-24 12:08:40

标签: php html mysql sql angularjs

我有一张表:

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,因为模板的另一部分要求我打印出包括重复项在内的所有内容

3 个答案:

答案 0 :(得分:1)

SQL中问题的答案是:

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

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

答案 1 :(得分:1)

您可以在SQL中执行此操作:

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

答案 2 :(得分:1)

您需要花费整个for循环遍历所有可用数据。将名称收集到一个新数组中,因为这使我们可以通过array_unique轻松获得独特的数据。另一个选择是将bankNames存储为数组中的键 - 请参阅第二个示例

<?
    $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;