SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.07.2010 06:14:34

SibCoder
Участник
Откуда: Барнаул
Зарегистрирован: 08.07.2010
Сообщений: 5

Убрать дублирование данных

Доброго времени суток уважаемые форумчане! smile

В общем проблема следующая:

Имеется таблица:


CREATE TABLE `cargo` (
  `id` int(100) NOT NULL auto_increment,
  `nick_id` varchar(25) NOT NULL default '',
  `name` varchar(255) NOT NULL default '',
  `stav` varchar(100) NOT NULL,
  `ves` varchar(255) NOT NULL default '',
  `ves_type` varchar(255) NOT NULL,
  `obem` varchar(255) NOT NULL default '',
  `lengthc` varchar(255) NOT NULL,
  `widthc` varchar(255) NOT NULL,
  `heightc` varchar(255) NOT NULL,
  `pa` varchar(255) NOT NULL default '',
  `pb` varchar(255) NOT NULL default '',
  `addr` int(100) NOT NULL default '0',
  `dostavka` varchar(255) NOT NULL default '',
  `data_po` varchar(40) NOT NULL,
  `postp` varchar(20) NOT NULL default '0',
  `region_o` varchar(200) NOT NULL,
  `other` varchar(255) NOT NULL default '',
  `region_o2` varchar(200) NOT NULL,
  `other2` varchar(255) NOT NULL default '',
  `edit` int(100) NOT NULL default '0',
  `about` text NOT NULL,
  `nds` varchar(255) NOT NULL,
  `length` varchar(255) NOT NULL,
  `update` varchar(255) NOT NULL,
  `date` varchar(255) NOT NULL,
  `time` varchar(20) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=34735 ;
 


Во всех полях кроме `time`,`date`,`dostavka`,`data_po` возможны дубликаты... Все поля должны выводиться, кроме `id` конечно.
Например выводятся четыре записи, из них три первых должны исключаться,а четвертая (у которой `id` самый большой) остаться. Подскажите пожалуйста как это организовать? roll.

С уважением, Сергей

Неактивен

 

#2 08.07.2010 10:19:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Убрать дублирование данных

Не понятен критерий выбора - какие строки оставить, а какие сохранить. Скажем, есть две строки, которые отличаются только id и obem. Их нужно одну или две? А если nick_id? Сформулируйте нормально задачу, а тогда и решение найдется.

Неактивен

 

#3 08.07.2010 10:40:53

SibCoder
Участник
Откуда: Барнаул
Зарегистрирован: 08.07.2010
Сообщений: 5

Re: Убрать дублирование данных

Извините за тупость постановки задачи smile

есть например запрос:

SELECT * FROM `cargo` WHERE `pa`='1' AND `pb`='2';


Выводит к примеру три записи у которых все поля одинаковы КРОМЕ этих полей:

`id`,`time`,`date`,`data_po`,`dostavka`,`time_cargo`

в этих полях кроме `id` находится время.

Т.е. получается что-то типа этого:

1-ая запись
время_1 | 1 | 1 | 1 | 1 | 1 | время_1 | время_1 |  время_1 |  время_1 | 1 | 1 |

2-ая запись
время_2 | 1 | 1 | 1 | 1 | 1 | время_2 | время_2 |  время_2 |  время_2 | 1 | 1 |

3-ая запись
время_3 | 1 | 1 | 1 | 1 | 1 | время_3 | время_3 |  время_3 |  время_3 | 1 | 1 |

Нужно чтобы выводилась только 3-ая запись

надеюсь понятно объяснил smile

Неактивен

 

#4 08.07.2010 10:50:47

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Убрать дублирование данных

Если в результате запроса Вы хотите получить всегда одну строку, то достаточно
добавить нужную сортировку и ограничение: ORDER BY id DESC LIMIT 1;

Если же Вы хотите получать все строки из таблицы с группировкой по остальным
полям, то тут запрос будет куда менее симпатичным:
SELECT * FROM cargo WHERE id IN
(SELECT MAX(id) FROM cargo GROUP BY :тут список полей, кроме различающихся: )

Неактивен

 

#5 08.07.2010 11:01:03

SibCoder
Участник
Откуда: Барнаул
Зарегистрирован: 08.07.2010
Сообщений: 5

Re: Убрать дублирование данных

Так в том-то и дело что нужно вывести все поля... т.к. потом php-скриптом они попадают в массив и циклом выводятся! Строк может быть и не сколько.. например имеется 7 товаров с одинаковыми характеристиками и разными датами и 5 вообще разных.. вот он должен вывести из 7 одинаковых последнюю и еще +5 других... Я совсем запутался.. sad

Неактивен

 

#6 08.07.2010 11:11:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Убрать дублирование данных

А как это противоречит тому, что написал я?

Неактивен

 

#7 08.07.2010 11:50:36

SibCoder
Участник
Откуда: Барнаул
Зарегистрирован: 08.07.2010
Сообщений: 5

Re: Убрать дублирование данных

SELECT * FROM cargo WHERE `pa`='136' AND `pb`='50' IN
(SELECT MAX(id) FROM cargo GROUP BY `nick_id`, `namegruz`, `stav`, `ves`, `ves_type`, `obem`, `lengthc`, `widthc`, `heightc`, `pa`, `pb`, `postp`, `region_o`, `other`, `region_o2`, `other2`, `edit`, `about`, `nds`, `length`, `update`, `dublirovanie`)

вот так надо было сделать? у меня условия идут по этим двум полям `pa`, `pb`

Неактивен

 

#8 08.07.2010 12:21:04

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Убрать дублирование данных

Лучше WHERE в подзапрос загоните — меньше строк будет обрабатывать.
Ну и группировать по ним не надо, т.к. они фиксированные.

Неактивен

 

#9 09.07.2010 07:53:54

SibCoder
Участник
Откуда: Барнаул
Зарегистрирован: 08.07.2010
Сообщений: 5

Re: Убрать дублирование данных

big_smile Запрос положил всю базу и сервак пришлось ребутить!!!

Неактивен

 

#10 09.07.2010 17:59:41

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Убрать дублирование данных

Не удивительно. Группировать по такому количеству полей — жестокое занятие.
Индексы на каких-то полях с большой дискретностью могут несколько облегчить
ситуацию. Но вообще надо, наверное, менять логику.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson