webxtor
Новичок
Выборка из двух таблиц с одинаковыми полями
У меня есть две таблицы с одинаковыми полями, с небольшой разницой:
p: id,name,photo,...
pt: orignal_id,name,photo,...
Итак мне нужно одним запросом взять для id=2 из таблицы p, если в pt нету такого original_id, а если есть, то взять из pt, а не из p.
LEFT JOIN'ом можно конечно это быстренько сделать, но если запись будет в обоих таблицах, то будет конфликт с одинаковыми полями... а с помощью PHP не очень хочется это все проверять (20 полей), но пока ничего другого не вижу!
Что скажете?
ЗЫ. Пожалуйста, не спрашивайте на счет рациональности проектирования, помогите с запросом!
-~{}~ 14.04.05 13:26:
Я сделал, но вышло громоздко все равно.. может есть вариант по-красивее?
[SQL]
SELECT p.approved, pt.moderated, pt.moder_notes,
IF (
pt.product_name IS NOT NULL , pt.product_name, p.product_name
) AS product_name,
IF (
pt.photo IS NOT NULL , pt.photo, p.photo
) AS photo,
IF (
pt.model IS NOT NULL , pt.model, p.model
) AS model,
IF (
pt.keywords IS NOT NULL , pt.keywords, p.keywords
) AS keywords,
IF (
pt.description IS NOT NULL , pt.description, p.description
) AS description,
IF (
pt.place_of_origin IS NOT NULL , pt.place_of_origin, p.place_of_origin
) AS place_of_origin,
IF (
pt.brand_name IS NOT NULL , pt.brand_name, p.brand_name
) AS brand_name,
IF (
pt.currency IS NOT NULL , pt.currency, p.currency
) AS currency,
IF (
pt.price IS NOT NULL , pt.price, p.price
) AS price,
IF (
pt.price_terms IS NOT NULL , pt.price_terms, p.price_terms
) AS price_terms,
IF (
pt.port IS NOT NULL , pt.port, p.port
) AS port,
IF (
pt.other_price_terms IS NOT NULL , pt.other_price_terms, p.other_price_terms
) AS other_price_terms,
IF (
pt.packing IS NOT NULL , pt.packing, p.packing
) AS packing,
IF (
pt.payment_remarks IS NOT NULL , pt.payment_remarks, p.payment_remarks
) AS payment_remarks,
IF (
pt.delivery_time IS NOT NULL , pt.delivery_time, p.delivery_time
) AS delivery_time,
IF (
pt.minimum_order IS NOT NULL , pt.minimum_order, p.minimum_order
) AS minimum_order,
IF (
pt.supply_ability IS NOT NULL , pt.supply_ability, p.supply_ability
) AS supply_ability,
IF (
pt.quality_certification IS NOT NULL , pt.quality_certification, p.quality_certification
) AS quality_certification
FROM products AS p
LEFT
JOIN products_temp AS pt ON ( p.id = pt.original_id )
WHERE p.id =4
[/SQL]
У меня есть две таблицы с одинаковыми полями, с небольшой разницой:
p: id,name,photo,...
pt: orignal_id,name,photo,...
Итак мне нужно одним запросом взять для id=2 из таблицы p, если в pt нету такого original_id, а если есть, то взять из pt, а не из p.
LEFT JOIN'ом можно конечно это быстренько сделать, но если запись будет в обоих таблицах, то будет конфликт с одинаковыми полями... а с помощью PHP не очень хочется это все проверять (20 полей), но пока ничего другого не вижу!
Что скажете?
ЗЫ. Пожалуйста, не спрашивайте на счет рациональности проектирования, помогите с запросом!
-~{}~ 14.04.05 13:26:
Я сделал, но вышло громоздко все равно.. может есть вариант по-красивее?
[SQL]
SELECT p.approved, pt.moderated, pt.moder_notes,
IF (
pt.product_name IS NOT NULL , pt.product_name, p.product_name
) AS product_name,
IF (
pt.photo IS NOT NULL , pt.photo, p.photo
) AS photo,
IF (
pt.model IS NOT NULL , pt.model, p.model
) AS model,
IF (
pt.keywords IS NOT NULL , pt.keywords, p.keywords
) AS keywords,
IF (
pt.description IS NOT NULL , pt.description, p.description
) AS description,
IF (
pt.place_of_origin IS NOT NULL , pt.place_of_origin, p.place_of_origin
) AS place_of_origin,
IF (
pt.brand_name IS NOT NULL , pt.brand_name, p.brand_name
) AS brand_name,
IF (
pt.currency IS NOT NULL , pt.currency, p.currency
) AS currency,
IF (
pt.price IS NOT NULL , pt.price, p.price
) AS price,
IF (
pt.price_terms IS NOT NULL , pt.price_terms, p.price_terms
) AS price_terms,
IF (
pt.port IS NOT NULL , pt.port, p.port
) AS port,
IF (
pt.other_price_terms IS NOT NULL , pt.other_price_terms, p.other_price_terms
) AS other_price_terms,
IF (
pt.packing IS NOT NULL , pt.packing, p.packing
) AS packing,
IF (
pt.payment_remarks IS NOT NULL , pt.payment_remarks, p.payment_remarks
) AS payment_remarks,
IF (
pt.delivery_time IS NOT NULL , pt.delivery_time, p.delivery_time
) AS delivery_time,
IF (
pt.minimum_order IS NOT NULL , pt.minimum_order, p.minimum_order
) AS minimum_order,
IF (
pt.supply_ability IS NOT NULL , pt.supply_ability, p.supply_ability
) AS supply_ability,
IF (
pt.quality_certification IS NOT NULL , pt.quality_certification, p.quality_certification
) AS quality_certification
FROM products AS p
LEFT
JOIN products_temp AS pt ON ( p.id = pt.original_id )
WHERE p.id =4
[/SQL]