MYSQL:UNION在两个表之间产生结果,如果在第二个表中找到PK,则省略第一个表中的记录

时间:2015-03-09 16:28:06

标签: mysql sql union

我有两张表productsproduct_edits,其中包含有关价目表的产品信息。我的应用程序的工作方式是,如果用户更改products表中的任何产品信息,则会将其插入product_edits表...

产品表

pk|code|name     |description|price|....
-----------------------------------
1 |QW1X|Product 1|...
2 |LW1X|Product 2|...
3 |DE1X|Product 3|...

PRODUCT_EDITS表

pk|product_id|code|name              |description|price|....
-----------------------------------
1 |         2|LW1X|Product 2 new name|...

在上面的例子中,我想要一个从两个表中返回记录的SQL,但是如果在product_edits表中找到了产品,它只从product_edits中选择,而不是从products表中选择。

我尝试使用standrd union但是从两个表中选择所有记录:

select code, name, description from products
union
select code, name, description from product_edits

3 个答案:

答案 0 :(得分:1)

select code, name, description from products
where code not in(select code from product_edits)
union
select code, name, description from product_edits

答案 1 :(得分:1)

在这种情况下,最好使用EXISTS代替IN。 您希望搜索在找到匹配后停止,而不是覆盖product_edits的所有结果。

所以这样做:

SELECT
    code, name, description
FROM products p
WHERE NOT EXISTS (SELECT 1 FROM product_edits e WHERE e.code = p.code)
UNION
SELECT
    code, name, description
FROM product_edits

答案 2 :(得分:-1)

您可以使用 IFNULL 功能 http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull

如果你的表是相关的,你可以尝试这样的事情:

SELECT 
    p.code, IFNULL(pe.name, p.name), IFNULL(pe.description, p.description) 
from 
    products p 
    left join product_edit pe on (p.id = pe.product_id)
UNION
SELECT 
    pe2.code, pe2.name, pe2.description
from 
    product_edits pe2

第一部分将为您提供仅在产品表中的产品以及两个表中的产品,但产品为product_edits.description。

第二部分将为您提供仅在products_edits表中的产品,因为union将删除重复记录