[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка из базы по дубликатам
Snus
Народ, голову сломал.
Имеем 2 таблицы:
1. - таблица с ценами
2. - таблица с описаниями приказов

Цель - удалить цены со старыми приказами, не трогая при этом те, на которые нет новых.

Как мне сделать запрос на выборку из 1 таблицы с условием, что на 4 ключа (code, addCode, counId, classId) есть более одной уникальной записи. Из полученных данных нужно выбрать более старый приказ по полю ДАТА из 2 таблицы. Дата в формате 10.01.1960.

Для наглядности прикрепляю изображение 1 таблицы (кусок).



Спустя 13 минут, 29 секунд (18.03.2011 - 18:20) Snus написал(а):
Вот пример дубликата. В этом случае парадоксально, НО 30 приказ может быть новее 50 (это наши умельцы редактировали старые приказы на новые, а я разгребаю теперь). Вычислить это можно по дате из таблицы с приказами. Как я сказал - дата в формате 10.01.1960. Из этих двух записей мне нужно в таком случае показать id 58628. С остальными точно также.

Спустя 5 минут, 19 секунд (18.03.2011 - 18:26) Snus написал(а):
Это таблица с приказами

Спустя 1 час, 50 минут, 49 секунд (18.03.2011 - 20:16) sergeiss написал(а):
Snus - что интересно, я у тебя дату в первых двух сообщениях не увидел :) Но, по-любому, у более свежей записи будет больше id.

Исходя из логики Постгре в таких запросах, я бы так предложил:
select max(id), count(code)  
from your_table
group by code
having count(code)>1
order by id desc

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

Спустя 24 минуты, 18 секунд (18.03.2011 - 20:41) Trianon написал(а):
Snus
Что это за СУБД?
Какая структура таблиц?
И можно ли её менять?

Спустя 1 час, 31 минута, 53 секунды (18.03.2011 - 22:13) alex12060 написал(а):
Trianon

эмм...тут явно виден стиль phpmyadmin-a smile.gif

Спустя 2 минуты, 21 секунда (18.03.2011 - 22:15) Snus написал(а):
sergeiss
Цитата
В этом случае парадоксально, НО 30 приказ может быть новее 50 (это наши умельцы редактировали старые приказы на новые, а я разгребаю теперь).

Не, в том-то и дело, что по id-то я сделал запрос, а вот с датой у меня проблемы.

Спустя 32 секунды (18.03.2011 - 22:15) Snus написал(а):
alex12060
Это скрин из phpmyadmin, все верно

Спустя 1 минута, 50 секунд (18.03.2011 - 22:17) Snus написал(а):
Trianon
В моих постах ответ на все твои вопросы. Поменять хочу - мне нужно добавить еще один ключ уникальности - это id приказа, пока я более старые записи (дубликаты) не удалю, сделать этого не получится.

Спустя 2 минуты, 23 секунды (18.03.2011 - 22:20) Snus написал(а):
Цитата (sergeiss @ 18.03.2011 - 17:16)
Snus - что интересно, я у тебя дату в первых двух сообщениях не увидел smile.gif

Цитата
Из полученных данных нужно выбрать более старый приказ по полю ДАТА из 2 таблицы


Спустя 6 минут, 21 секунда (18.03.2011 - 22:26) Snus написал(а):
Вы меня не правильно поняли.
У меня в таблице данные по ценам ТНВЭД.
Цена уникальна для ключей Код-ДобКод-Страна-Класс-Марка.
То есть, например для кода (например) 01234567890 1234 Россия Люкс Адидас - цена 5.60, для тех же параметров, но страны Китай - будет совсем другая цена. Изначально мне ставили ТЗ, что нужно держать и старые цены по приказам и новые. Потом дали указание старые убрать и в случае добавления новых - чтобы обновлялся приказ и цена. Я бы с удовольствием, НО - какая-то зараза переименовала старые приказы вместо того, чтобы добавить новые... и соответственно, приказ с ID 30 может быть на пару лет новее, чем ID 50. В этом-то и задница заключается. Плюс ко всему дата приказа в формате 10.01.1960. И эта дата - единственная зацепка в определении более нового приказа.

Спустя 27 минут, 49 секунд (18.03.2011 - 22:54) Trianon написал(а):
Цитата (Snus @ 18.03.2011 - 22:17)
Trianon
В моих постах ответ на все твои вопросы. Поменять хочу - мне нужно добавить еще один ключ уникальности - это id приказа, пока я более старые записи (дубликаты) не удалю, сделать этого не получится.


Про СУБД я спросил потому, что если это не MySQL а что-либо иное, (к примеру postgreSQL , как предположил почему-то sergeiss, или MSSQL или ORACLE ) то и методики решения могут оказаться совершенно иными.

Про структуру спросил потому, что скриншот таблицы некоего SQLадмина еще не дает информации о типах полей и индексах, на них расставленных.
А результат запроса оператора SHOW CREATE TABLE таблица2; (то есть текст оператора создания таблицы, который собственно и называется её структурой) такой ответ дает. А от этого сильно зависит, к примеру, то как лучше строить работу с датами.

Про есть ли возможность менять спросил потому, что иногда ситуация такова, что менять ничего нельзя. Можно лишь писать DML-запросы на уже кем-то созданных таблицах, без возможности их модифицировать. И соответственно подход тогда тоже иной.

Тавк вот, в Ваших постах, простите за выражение, не было нихрена.
И что мешало ответить
-----------
1. Субд - mysql
2. таблицы
CREATE TABLE risks 
(
id INT(10) NOT NULL DEAULT NULL AUTO_INCREMENT PRIMARY KEY,
code CHAR(10) NOT NULL DEFAULT '',
...
и т.д.
);


CREATE TABLE orders 
(
id INT(10) NOT NULL DEAULT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL DEFAULT '',
...
и т.д.
);


3. менять можно. Как лучше поменять?
или менять нельзя категорически - нужно обходиться SELECT-запросами именно на такой структуре
---
вот что мешало примерно так ответить, я не въезжаю, хоть убейся.

Спустя 8 минут, 8 секунд (18.03.2011 - 23:02) Trianon написал(а):
Цитата (alex12060 @ 18.03.2011 - 22:13)
Trianon

эмм...тут явно виден стиль phpmyadmin-a smile.gif

У меня phpMyAdmin выглядит совершенно по-другому.
Почему и спросил про СУБД.

Спустя 5 минут, 4 секунды (18.03.2011 - 23:07) Snus написал(а):
Trianon

Почему-то я сделал вывод, что вряд ли ты мне сможешь помочь :)

CREATE TABLE `db_risk` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`code` varchar(10) NOT NULL COMMENT 'Код ТНВЭД',
`addCode` int(11) NOT NULL COMMENT 'Доб. код',
`counId` int(11) NOT NULL COMMENT 'ID страны',
`prId` int(11) NOT NULL COMMENT 'ID приказа',
`classId` int(11) NOT NULL COMMENT 'ID класса',
`markId` int(11) NOT NULL COMMENT 'ID марки',
`unitId` int(11) NOT NULL COMMENT 'ID ЕИ',
`risk` varchar(30) NOT NULL COMMENT 'Цена',
`note` varchar(50) NOT NULL COMMENT 'Дополнение',
`userId` int(11) NOT NULL COMMENT 'ID пользователя',
`del` int(1) NOT NULL COMMENT 'Статус Удалено',
PRIMARY KEY (`id`),
UNIQUE KEY `code` (`code`,`addCode`,`counId`,`prId`,`classId`,`markId`)
)
ENGINE=MyISAM AUTO_INCREMENT=4394033 DEFAULT CHARSET=utf8

Спустя 2 часа, 24 минуты, 32 секунды (19.03.2011 - 01:32) Trianon написал(а):
а таблица с приказами?
Там, где поле даты?
И чтоб два раза не вставать,
в этом поле даты, если допустим нужно записать дату "пятое марта 2011 г.", как будет значение поля с датой выглядеть?

В это поле действительно упирается очень и очень многое.
дело в том, что пока она записана в таком "нечеловечьем" формате, работать с ней крайне неудобно. Чтобы можно было на лету определять максимальную дату её придется развернуть в сторону общепринятого YYYY-mm-dd .
Сделать это можно будет парой тройкой запросов, но чтобы сформулировать их, нужны ответы на те вопросы, которые я задал.

Спустя 10 часов, 40 минут, 27 секунд (19.03.2011 - 12:12) sergeiss написал(а):
Позвольте я встряну smile.gif

Я не предполагал, что это Постгре. Просто я с Постгре работаю и уже несколько раз наталкивался на то, что в Постгре и в MySQL по-разному идет обработка данных.

И что касается моего кода. Я же написал, что он - основа для дальнейшей работы, а не окончательное решение. Потому что зная id документов, уже можно с ними работать. В "моей" выборке будут id новых приказов, причем тех, для которых есть не менее двух записей в таблице. Если там убрать DESC, то тогда будут выбраны id документов с меньшим id, т.е. более старые. Этот список id можно тут же использовать для удаления, что и хотел получить автор.

И я не понял, кстати. А ТС хотя бы попробовал сделать реальный запрос так, как я написал, или он только "умозрительно" работает с БД?

Спустя 1 день, 8 часов, 28 минут, 14 секунд (20.03.2011 - 20:40) Snus написал(а):
sergeiss
Да, твой пост натолкнул на мысль, спасибо. :)

Вот что мне нужно было.
SELECT dbr.id, COUNT( * ) AS `cnt`
FROM `db_risk` AS `dbr`
INNER JOIN `db_pr` AS `dbp` ON dbp.id = dbr.prId
WHERE dbr.classId =0
GROUP BY dbr.code, dbr.addCode, dbr.counId, dbr.classId
HAVING `cnt` >1
ORDER BY dbp.date ASC , dbp.version ASC
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.