Forum Webscript.Ru
Общие => Базы данных => Тема начата: listopad от 26 Сентября 2004, 18:47:34
-
Добрый день.
Есть такая проблема, люди , кто может посоветуйте пожалуйста.!
Есть таблица клиетнов с СТОЛЬЦАМИ
ID -NAME- ADRES-MAIL-OTHER-
МНОГО ЗАПИСЕЙ ГДЕ MAIL ОДИН И ТОТ ЖЕ . Т. Е БОНАЛЬНЫЕ ПОВТОРЫ.
НЕОБХОДИМО СДЕЛАТЬ ТАК, ЧТОБЫ ИЗ ЭТОЙ ТАБЛИЦЫ СДЕЛАТЬ ТОЧНО ТАКУЮ ЖЕ НО ЧТОБЫ MAIL НЕ ПОВТОРЯЛСЯ ! Т. Е ВСЕ ЗАПИСИ ГДЕ МЫЛО ПОВТОРЯЕТЬСЯ БОЛЬШЕ 1 РАЗА , ПРОСТО ВЗЯТЬ И УДАЛИТЬ .!!!
Я ЗНАЮ ТОЛЬКО ТАК
CREATE TABLE people_new SELECT DISTINCT mail FROM people
НО В ЭТОМ СЛУЧАЕ СОЗДАЕТЬСЯ ТАБЛИЦА ТОЛЬКО С СТОЛБЦОМ mail , А мне еще нужны и данные из остальных столбцов !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Если делаю вот так
CREATE TABLE people_new SELECT DISTINCT id,mail FROM people
-- Но id уникальны, а ,соответственно, mail повторяются с повторами !!!!
Очень благодарен !!!
-
а приложение простенькое или функцию написать слабо?
-
listopad
Читаем в мануале что DISTINCT выбирает уникальные поля
соответсвенно:
-- Но id уникальны, а ,соответственно, mail повторяются с повторами !!!!
Что и следовало ожидать
А есть такая функция как GROUP BY, и если мы сделаем так:
CREATE TABLE people_new SELECT id, mail FROM people GROUP BY mail
То все будет как положено, только вот id будет подставлятся, первый попавшийся...
DISTINCT - это тот же GROUP BY только для всех выбранных столбцов
-
Огромное спасибо !
Как же я сам не додумался ;)
-
А сейчас проблема еще хуже.
Я сижу на masterhost. У них версия mysql 3.23
Что опять не получается !
Да допустим я создал новую таблицу с неповторяющимися mail.
Спосибо за это -Phoinix .
Имею две таблицы people_new и people.
Теперь пытаюсь как раз найти тех , кто не вошел в новую таблицу
если делать так
SELECT ID FROM people_new, people WHERE people_new.ID != people.ID
--не работает ,т. к. как я понимаю такие запросы работают только в более новых версиях.
Если делаю так
SELECT id, count( * ) AS count
FROM people
GROUP BY email
HAVING count >1
ORDER BY count DESC
Он показывает какие адреса как раз повторяются , но по одному из кажной записи попали в новую таблицу , А мне нужны как раз только те которые не попали вообще , Или не попадут если использовать
CREATE TABLE people_new SELECT id, mail FROM people GROUP BY mail
-
listopad
т. к. как я понимаю такие запросы работают только в более новых версиях
Неправильно понимаешь
SELECT ID FROM people_new, people WHERE people_new.ID != people.ID
ID какой таблицы ты выбираешь? может все-таки people.ID ???
-
Если так , то получается вообще какой-то бред
SELECT people.ID FROM people_new, people WHERE people_new.ID != people.ID
В одной таблице 875 записей , в другой , соответственно, в которой без повторов 825 . Он должен вывести мне id этих 50 записей. А он откуда-то берет 721050 записей?????????
-
Хотя, если поискать совпадающие id так
SELECT people.ID FROM people_new, people WHERE people_new.ID = people.ID
То все хорошо, выводит 825 записей !!!!!!!!!!!!! как, по логике и должно быт !!!!!!!!!
-
listopad
Однако... логику SQL понимаем?
Почему бред... все правильно тебе выводит...
Можно даже посчитать:
875 х (825 - 1) = 721000, Это количество не повторов записей таблиц, отнимаем 1 потому, что 1 раз - все таки есть повтор
Но 50 записей у нас все же не повторяются, значит:
721000 + 50 = 721050 - вполне реальная цифра, если немного подумать, то можно путем несложных манипуляций сузить результат до 50...
Проверять не буду... тут главное принцип...
SELECT COUNT(people.ID) AS sum
FROM people_new, people
WHERE people_new.ID != people.ID
GROUP BY people.ID
HAVING sum = \'825\'