Выберите дубликаты с PHP & MySql для процесса слияния - PullRequest
0 голосов
/ 03 декабря 2009

Я написал код для выбора дубликатов и группировки их по имени и фамилии. Я собираю их в многомерный массив и с помощью jQuery / Ajax на получающейся странице выводю / объединяю их. Я хотел бы спросить, есть ли лучший способ создания массива, чем, как я это делаю. Вот мой код Спасибо.

<code>$dataArr=fetchDups($conn, 13, 5); // get a few at a time

print '<div style="clear:both;"></div><pre>';
print_r($dataArr);
print '
'; функция fetchDups ($ conn, $ client_id, $ limit = '') { $ sql = 'SELECT * ИЗ `контактов` ГДЕ` clientid` = \' 13 \ 'GROUP BY fname, lname'; // $ sql = 'SELECT DISTICT fname, lname, * FROM `клиентов` WWHERE` clientid` = \' 13 \ ''; $ res = mysql_query ($ sql, $ conn) или die (mysql_error ()); $ ContactsRow = массив (); в то время как ($ строка = mysql_fetch_array ($ разреш)) { echo $ row ['fname']. '
'; $ ContactsRow [] = $ строки; } mysql_freeresult ($ Рез); $ DataArr = массив (); $ I = 0; $ LimitNum = 0; // ---------------------------------- foreach ($ contactsRow AS $ rowNew) { $ sql = 'SELECT * FROM `contacts` WHERE` clientid` = \' 13 \ 'AND `id`! = \' '. $ rowNew [' id '].' \ ' И (`fname` = \ ''. $ RowNew ['fname']. '\' ИЛИ` lname` = \ ''. $ RowNew ['lname']. '\') «; // echo $ sql; $ res = mysql_query ($ sql, $ conn) или die (mysql_error ()); $ RowCountDup = mysql_num_rows ($ разреш); если ($ rowCountDup> 0) { $ D = 0; $ DataArr [$ я] = массив (); $ DataArr [$ я] [$ d] = $ rowNew; в то время как ($ rowNew = mysql_fetch_array ($ разреш)) { $ DataArr [$ я] [($ D + 1)] = $ rowNew; $ D ++; } $ Я ++; $ LimitNum ++; } // ограничить результаты. слишком много вылетает браузер если ($ limitNum == $ предел) { перерыв; } } mysql_freeresult ($ Рез); вернуть $ dataArr; }

Ответы [ 3 ]

0 голосов
/ 03 декабря 2009

Для такого рода вещей вам, вероятно, следует попробовать:

SELECT * FROM contacts refC JOIN contacts allC USING (fname, lname) WHERE refC.clientid='13'

Это само-присоединение к контактам на основе имени и фамилии, поэтому allC создает псевдоним списка всех контактов, которые имеют имена и фамилии refC (включая его самого).

Таким образом, вы получаете всю информацию, которую ищете, только в одном запросе SQL. Для настройки можно выполнить запрос, добавив индекс по столбцам fname и lname таблицы contacts, поэтому объединению не нужно анализировать всю таблицу на соответствие.

- редактировать: вы можете более точно указать, как вы объединяете свои таблицы, например:

SELECT *
FROM contacts refC
JOIN contacts allC ON (allC.fname LIKE CONCAT(refC.fname, '%') AND allC.lname LIKE CONCAT(refC.lname, '%'))
WHERE refC.clientid='13'

Что строго эквивалентно (но ИМО легче читать, чем):

SELECT *
FROM contacts refC,contacts allC
WHERE allC.fname LIKE CONCAT(refC.fname, '%') 
AND allC.lname LIKE CONCAT(refC.lname, '%')
AND refC.clientid='13'
0 голосов
/ 03 декабря 2009

Или вы можете попробовать что-то вроде второго запроса, который использует производную таблицу:

mysql> select * from contacts ;
+----+--------+---------+
| id | fname  | lname   |
+----+--------+---------+
| 1  | Annie  | Haddock |
| 2  | Annie  | Haddock |
| 3  | Ginger | Mole    |
| 4  | Ted    | Ted     |
| 5  | Ted    | Ted     |
+----+--------+---------+
5 rows in set (0.01 sec)

mysql> select id, fname, lname, total from 
             (select *, count(*) as total 
              from contacts group by fname, lname) people 
       where total > 1;
+-----------+--------------+--------------+--------------+
| people.id | people.fname | people.lname | people.total |
+-----------+--------------+--------------+--------------+
| 1         | Annie        | Haddock      | 2            |
| 4         | Ted          | Ted          | 2            |
+-----------+--------------+--------------+--------------+
2 rows in set (0.01 sec)

, затем просто переберите его с помощью foreach. Обратите внимание, что "people" выше - это псевдоним для производной таблицы, созданной внутренним выбором

0 голосов
/ 03 декабря 2009

Если вы просто хотите избежать отображения дубликатов и не удалять их из вашей базы данных, используйте DISTINCT ключевое слово SQL.

...