如何在foreach数据库查询中检测重复项

时间:2018-09-14 15:33:46

标签: php mysql foreach duplicates

我有一个功能getRows(),可以在foreach循环中运行。它为我提供了MySQL查询返回的所有行。名称存储为first.last,而我只是得到名字。问题是名称重复,因此如果名称相同,我需要对它们进行处理(我当时正在考虑获取姓氏的子字符串)。

鉴于我的职能,我该如何检查重复项并执行其他操作?

函数getRows()

public function getRows($query, $params = []) {
    try {
        $stmt = $this->db_data->prepare($query);
        $stmt->execute($params);
        return $stmt->fetchAll();
    } catch (PDOException $e) {
        throw new Exception($e->getMessage());
    }
}

foreach

<?php

foreach($division_result = $db->getRows('SELECT * FROM users WHERE division=? ORDER BY username', ['AWM']) as $division) {
    $username = $division['username'];
    $short_list_name = substr($username, 0, strpos($username, '.'));
    echo $short_list_name . '<br>';
}
?>

结果

alicia
amy
angel
ashley
caitlin
cassie
cory
courtney
debbie
gabby
jamie
kamron
kelly
mallory
oliver
rhonda
tim <-- THIS ONE
tim <-- AND THIS ONE
tommy
travis

我可以跑步

 mysql> SELECT SUBSTRING_INDEX(username, '.', 1) FROM users WHERE division='AWM' GROUP BY SUBSTRING_INDEX(username, '.', 1) HAVING count(*) > 1;

来自终端,它产生:

+-----------------------------------+
| SUBSTRING_INDEX(username, '.', 1) |
+-----------------------------------+
| tim                               |
+-----------------------------------+
1 row in set (0.00 sec)

修改 但是我不知道如何将其合并到当前的foreach中,因为我需要两个名字。我只需要检测它们并对字符串做些不同的事情即可。

1 个答案:

答案 0 :(得分:0)

另一种选择是在查询中添加数据。如果用于轻量级数据库,则可以这样重写请求:

SELECT * 
FROM users join 
     (SELECT username,COUNT(*) as dupes FROM users GROUP BY username) as foo using(username) 
WHERE division=? 
ORDER BY username

非常繁重,可能无法在所有数据库上使用。但更直接的是,此后您只需要检查dupes> 1。