Рабочий запрос, объединяющий две таблицы, идеален, за исключением того, что я не могу избавиться от дубликатов - PullRequest
3 голосов
/ 01 февраля 2011

У меня есть веб-сайт CarComparison, который загружает каналы с других автомобильных сайтов.Один из каналов, которые он получает, взят с сайта, который позволяет людям, которые разместили рекламу, обновлять его несколько раз.Как правило, автомобили обновляются каждые 10–14 дней.

В любом случае, единственный доступ к их данным у меня есть через канал RSS, который я анализирую и извлекаю полезные данные.Я получаю его каждую минуту, и в нем обычно 15 или около того новых машин.

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

Запрос, который я запускаю, чтобы присоединиться к таблицам:

SELECT DISTINCT cc_detail.original_id, cc_detail.year, cc_detail.price, cc_detail.make, cc_detail.model, cc_detail.referrer_site, wposts . *
FROM cc_posts wposts
LEFT JOIN cc_posts_detail cc_detail ON ( wposts.ID = cc_detail.post_id )
WHERE 1 =1
AND (
cc_detail.year >1949
)
AND (
cc_detail.price >0
)
AND cc_detail.referrer_site = 'CarSiteX'
AND wposts.post_status = 'publish'
AND wposts.post_type = 'post'
AND wposts.post_date < NOW( )
AND cc_detail.year <=2011
AND wposts.post_title NOT LIKE 'Ac%'
AND cc_detail.make != ''
AND cc_detail.model != ''
AND (
cc_detail.price +0
) >100
AND (
wposts.post_date > "2011/01/02 "
)
ORDER BY cc_detail.original_id ASC
LIMIT 30 , 300

Проблема в том, что я не могу понять, как изменитьзапрос такой, что он вытягивает только одну строку на значение original_id.Там, где игрок на CarSiteX пару раз обновлял свой автомобиль, я каждый раз получаю ряд для одного и того же автомобиля.У меня есть уникальный original_id, так как мне изменить вышеупомянутый запрос, чтобы получать только самые последние строки для каждого значения original_id в таблице cc_posts_detail?

Вот несколько примеров строк, которые показывают проблему:

original_id  year  price  make  model  referrer_site  ID  post_author  post_date  post_date_gmt  post_content  post_title  post_excerpt  post_status  comment_status  ping_status  post_password  post_name  to_ping  pinged  post_modified  post_modified_gmt  post_content_filtered  post_parent  guid  menu_order  post_type  post_mime_type  comment_count
1143583  2000  2900  lexus  is200  CarSitex  9633341  1  2011-01-19 05:34:01  2011-01-19 12:34:01     2000 Manual 2.0 Petrol 136k miles NCT  039 d 0...  Lexus Is200 2000     publish  open  open     lexus-is200-2000-        2011-01-19 05:34:01  2011-01-19 12:34:01     0     0  post     0
1149513  1997  2000  mitsubishi  colt  CarSitex  8978523  1  2011-01-05 12:26:01  2011-01-05 19:26:01     1600cc mivec twin cam 16valve. 175 bhp.Four br...  Mitsubishi Colt 1997     publish  open  open     mitsubishi-colt-1997-        2011-01-05 12:26:01  2011-01-05 19:26:01     0     0  post     0
1149513  1997  2000  mitsubishi  colt  CarSitex  9416296  1  2011-01-14 12:04:01  2011-01-14 19:04:01     1600cc mivec twin cam 16valve. 175 bhp.Four br...  Mitsubishi Colt 1997     publish  open  open     mitsubishi-colt-1997-        2011-01-14 12:04:01  2011-01-14 19:04:01     0     0  post     0
1156791  2004  5950  ford  focus  CarSitex  9163527  1  2011-01-08 10:04:01  2011-01-08 17:04:01     2004 FORD FOCUS 1.4 4 DOOR 78333 MILES NCT D 1...  Ford Focus 2004     publish  open  open     ford-focus-2004-        2011-01-08 10:04:01  2011-01-08 17:04:01     0     0  post     0

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

Извините, если я добавил слишком много информации или если это слишком много вопросов ... Впервыеэтот.Любая помощь приветствуется!

cc_post_details структура:

id  int(4) 
referrer_site   varchar(100) 
original_id     bigint(8) 
dealer  varchar(255) 
make    varchar(100) 
model   varchar(100) 
colour  varchar(100) 
year    varchar(8) 
engine_size     int(4) 
mileage     int(4) 
price   int(4) 
location    varchar(100) 
fuel_type   varchar(50) 
body_type   varchar(50) 
transmission    varchar(50) 
doors   int(4) 
image_base_url  varchar(255) 
image_main  text 
image_thumb     text 
post_id     int(4) 
date_added  datetime 
underscore_beepbeep_pos     int(11)

cc_posts Структура

    ID  bigint(20) 
post_author     bigint(20) 
post_date   datetime 
post_date_gmt   datetime 
post_content    longtext 
post_title  text 
post_excerpt    text 
post_status     varchar(20) 
comment_status  varchar(20) 
ping_status     varchar(20) 
post_password   varchar(20) 
post_name   varchar(200) 
to_ping     text 
pinged  text 
post_modified   datetime 
post_modified_gmt   datetime 
post_content_filtered   text 
post_parent     bigint(20) 
guid    varchar(255) 
menu_order  int(11) 
post_type   varchar(20) 
post_mime_type  varchar(100) 
comment_count   bigint(20) 

Ответы [ 5 ]

1 голос
/ 25 апреля 2011

Как насчет использования триггера для простого удаления каждой старой записи при публикации нового дубликата?

CREATE TRIGGER REMOVE_OLD
ON CC_POST_DETAILS
BEFORE INSERT
AS
DECLARE @O_ID BIGINT(8), @MAKE VARCHAR(100), @MODEL VARCHAR(100)
BEGIN

SELECT @O_ID = INSERTED.ORIGINAL_ID FROM INSERTED
SELECT @MAKE = INSERTED.MAKE FROM INSERTED
SELECT @MODEL = INSERTED.MODEL FROM INSERTED

DELETE * FROM CC_POST_DETAILS
WHERE CC_POST_DETAILS.ORIGINAL_ID = @O_ID
AND CC_POST_DETAILS.MAKE = @MAKE
AND CC_POST_DETAILS.MODEL = @MODEL

END

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

0 голосов
/ 18 апреля 2011

Я мог бы подумать о множестве проблем и решений здесь.Так вы получаете каналы с разных сайтов ??спрашиваю, так как автор сообщения равен 1 на всех сообщениях!И не является ли ваш original_id частью первичного ключа для предотвращения повторяющихся записей?

0 голосов
/ 01 февраля 2011

Проблема с wposts. * В вашем выражении select (не говоря уже о select * is bad ).Ключевое слово Distinct покажет только отдельные строки.Когда вы добавляете wposts. * К вашему запросу, он получает ID, post_date, post_date_gmt, которые отличаются для каждого поста на одном и том же автомобиле.

Существует несколько способов исправить это:

Вы можете создать группу, но тогда вам придется выполнить статистическую функцию (max, min, avg и т. Д.) Для всех столбцов, не входящих в группу, с помощью.

Другим способом было бы сделать два запроса.Первым будет запрос, который у вас есть сейчас, но только original_id в select.Затем у вас есть коллекция original_ids, вы можете получить детали для всех автомобилей в первом запросе.

0 голосов
/ 01 февраля 2011

выберите последнее. * Из подробностей последнее сообщение о присоединении на post.id = latest.postid и не существует (выберите 1 из подробностей, где latest.original_id = original_id и latest.post_modified

Просто идея.

0 голосов
/ 01 февраля 2011

Используйте GROUP BY cc_detail.original_id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...