Как обнаружить дубликаты в каждом запросе БД - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть функция 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, поскольку мне нужны оба имени. Мне просто нужно обнаружить их и сделать что-то другое со строками.

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Другой вариант - добавить данные в ваш запрос. Если вы используете легкую БД, вы можете переписать ваш запрос следующим образом:

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.

0 голосов
/ 14 сентября 2018

Вы можете сохранить список имен в массиве и проверить, есть ли в нем имя

$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>';
    }

}

?>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...