Forum Webscript.Ru

Общие => Базы данных => Тема начата: listopad от 26 Сентября 2004, 18:47:34

Название: Проблема с mysql
Отправлено: 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 повторяются с повторами !!!!

Очень благодарен !!!
Название: Проблема с mysql
Отправлено: commander от 28 Сентября 2004, 13:47:33
а приложение простенькое или функцию написать слабо?
Название: Проблема с mysql
Отправлено: Phoinix от 28 Сентября 2004, 14:16:28
listopad

Читаем в мануале что DISTINCT выбирает уникальные поля
соответсвенно:
Цитировать
-- Но id уникальны, а ,соответственно, mail повторяются с повторами !!!!

Что и следовало ожидать

А есть такая функция как GROUP BY, и если мы сделаем так:
CREATE TABLE people_new SELECT id, mail FROM people GROUP BY mail

То все будет как положено, только вот id будет подставлятся, первый попавшийся...

DISTINCT - это тот же GROUP BY только для всех выбранных столбцов
Название: Проблема с mysql
Отправлено: listopad от 28 Сентября 2004, 23:03:12
Огромное спасибо !
Как же я сам не додумался ;)
Название: Проблема с mysql
Отправлено: listopad от 29 Сентября 2004, 15:08:54
А сейчас проблема еще хуже.
Я сижу на 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
Название: Проблема с mysql
Отправлено: Phoinix от 29 Сентября 2004, 18:48:14
listopad

Цитировать
т. к. как я понимаю такие запросы работают только в более новых версиях

Неправильно понимаешь

Цитировать
SELECT ID FROM people_new, people WHERE people_new.ID != people.ID

ID какой таблицы ты выбираешь? может все-таки people.ID ???
Название: Проблема с mysql
Отправлено: listopad от 29 Сентября 2004, 19:43:52
Если так , то получается вообще какой-то бред

SELECT people.ID FROM people_new, people WHERE people_new.ID != people.ID

В одной таблице 875 записей , в другой , соответственно, в которой без повторов 825 . Он должен вывести мне id этих 50 записей. А он откуда-то берет 721050 записей?????????
Название: Проблема с mysql
Отправлено: listopad от 29 Сентября 2004, 19:50:03
Хотя, если поискать совпадающие id так
SELECT people.ID FROM people_new, people WHERE people_new.ID = people.ID

То все хорошо, выводит 825 записей !!!!!!!!!!!!! как, по логике и должно быт !!!!!!!!!
Название: Проблема с mysql
Отправлено: Phoinix от 30 Сентября 2004, 14:27:40
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\'