Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Странно работает удаление одинаковых записей

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
dezz
Отправлено: 14 Марта, 2011 - 00:31:59
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




Имею таблицу
id | text
-------------
1 | qq
2 | ww
3 | qq
4 | gf
5 | pu
6 | ww
7 | qq
8 | cx

Видим, что существуют записи с одинаковым значением 'text' (qq, ww)
Нужно удалить одинаковые записи, но, чтобы одна из записей осталась, т.е. запись со значением 'qq' в базе повторяется 3 раза (id -1,3,7), нужно удалить записи с id == 3,7
Написал вот такой код:
PHP:
скопировать код в буфер обмена
  1. function del($table)
  2. {
  3.         $sql = mysql_query("SELECT * FROM $table");
  4.         for ($i=0; $i<mysql_num_rows($sql); $i++)
  5.         {
  6.                 $f = mysql_result($sql, $i, 1); // получаю значение из колонки 'text'
  7.                 $f_id = mysql_result($sql, $i, 0); // получаю значение из колонки 'id'
  8.                 for ($x=0; $x<mysql_num_rows($sql); $x++)
  9.                 {
  10.                         $s = mysql_result($sql, $x, 1);
  11.                         $s_id = mysql_result($sql, $x, 0);
  12.                         if (($f==$s) && ($f_id!=$s_id)) // сравниваю одинаковые ли записи, но чтобы id были разные
  13.                         {
  14.                                 mysql_query("DELETE FROM $table WHERE ID=$s_id;"); // Удаляю повторяющуюся запись
  15.                         }
  16.                 }
  17.         }
  18. }

Ошибка вот в чём. Удаляются все записи, т.е. будут удалены все записи со значением 'ww', 'qq'.
Мне кажется, что я не замечаю чего то элементарного, просто глаза замылены Улыбка
 
 Top
OrmaJever
Отправлено: 14 Марта, 2011 - 01:21:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Лутше при записи в базу проверять значения и записывать только уникальные.
Но если решили однократно почистить базу то просто достаньте все значения из таблицы в масив, затем array_unique(), и обратно запишите уже уникальные значения

(Отредактировано автором: 14 Марта, 2011 - 01:22:51)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
Champion Супермодератор
Отправлено: 14 Марта, 2011 - 18:05:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id FROM TABLE WHERE t1 EXISTS (SELECT * FROM TABLE t2 WHERE t2.id < t1.id AND t2.text = t1.text)
- айдишки получили, теперь по ним можно удалить.
 
 Top
dezz
Отправлено: 14 Марта, 2011 - 19:56:21
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




Спасибо за предложенные варианты. Конечно хотелось бы ещё понять, почему мой метод не работает Улыбка
Champion пишет:
CODE (SQL):
скопировать код в буфер обмена
  1.  SELECT id FROM TABLE WHERE t1 EXISTS (SELECT * FROM TABLE t2 WHERE t2.id < t1.id AND t2.text = t1.text)

- айдишки получили, теперь по ним можно удалить.

t1 и t2 на сколько я понимаю - это две одинаковые таблицы?
При выполнении данного запроса вылетает вот такая ошибка:
Цитата:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TABLE WHERE auto EXISTS (SELECT * FROM TABLE auto2 WHERE auto2.id < auto.id AND ' at line 1
 
 Top
Champion Супермодератор
Отправлено: 14 Марта, 2011 - 20:03:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




dezz пишет:
t1 и t2 на сколько я понимаю - это две одинаковые таблицы?
Это одна таблица. А когда происходит ошибка, мне лучше бы взглянуть на тот запрос, в котором она произошла, а не на свой.
(Добавление)
dezz пишет:
FROM TABLE WHERE t1 EXISTS

... FROM TABLE t1 WHERE EXISTS ...
Мимо написал.
 
 Top
dezz
Отправлено: 14 Марта, 2011 - 20:20:50
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




Переименовал таблицу в t1, делаю запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id FROM TABLE WHERE t1 WHERE EXISTS (SELECT * FROM TABLE t2 WHERE t2.id < t1.id AND t2.text = t1.text)

Ошибка:
Цитата:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TABLE WHERE t1 WHERE EXISTS (SELECT * FROM TABLE t2 WHERE t2.id < t1.id AND t2.t' at line 1
 
 Top
Champion Супермодератор
Отправлено: 14 Марта, 2011 - 20:23:57
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Не надо ничего переименовывать. Блин, как у тебя таблица называется?
(Добавление)
CODE (SQL):
скопировать код в буфер обмена
  1.       SELECT id FROM настоящееимятвоейтаблицы t1  WHERE EXISTS (SELECT * FROM настоящееимятвоейтаблицы  t2 WHERE t2.id < t1.id AND t2.text = t1.text)
Поменяй только настоящееимятвоейтаблицы. Всё. Ну надо синтаксис sql-то знать
(Добавление)
И текст сообщения об ошибке читать
 
 Top
dezz
Отправлено: 14 Марта, 2011 - 20:34:03
Post Id


Новичок


Покинул форум
Сообщений всего: 11
Дата рег-ции: Июнь 2010  


Помог: 0 раз(а)




Спасибо, конечно с именем таблицы я немного протупил, я сразу обратил на это внимание, просто смутил тот факт, что TABLE было в верхнем регистре и по этому подумал, что так и надо... Улыбка
 
 Top
Champion Супермодератор
Отправлено: 14 Марта, 2011 - 20:35:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Ну да, это здешняя шняжка регистр подняла. Надо было мне не слово table использовать, чтоб не смущать
 
 Top
zardoz
Отправлено: 15 Марта, 2011 - 00:40:35
Post Id


Гость


Покинул форум
Сообщений всего: 100
Дата рег-ции: Сент. 2010  


Помог: 0 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM t1 WHERE id NOT IN (SELECT id FROM t1 GROUP BY text)


В принципе можно уникальный ключ по полю text сделать чтобы дубляжи и не вставлялись.

С уважением.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB