如何在foreach db查询中检测重复

7cwmlq89  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(375)

我有一个可以在foreach循环中运行的函数getrows()。它给出了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,因为我需要两个名字。我只需要检测它们并对字符串做些不同的处理。

lb3vh1jj

lb3vh1jj1#

另一个选择是在查询中添加数据。如果在light db上使用,您可以这样重写您的请求:

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

相当重,可能不适用于所有db。但更直接的是,在那之后你只需要检查一下 dupes >1.

7nbnzgx9

7nbnzgx92#

您可以在数组中存储名称列表,并检查其中是否存在名称

$names = [];
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, '.'));
    if (in_array($short_list_name, $names)) {
        // another action
    } else {
        $names[] = $short_list_name;
        echo $short_list_name . '<br>';
    }

}

?>

相关问题