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

MYSQL: UNION results between two tables where omitting records from first table if PK found in second table

我有两个 table productsproduct_edits,它们保存价目表上的产品信息。我的应用程序的工作方式是,如果用户更改 products table 中的任何产品信息,它会将其插入 product_edits table...

产品table

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

PRODUCT_EDITS table

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

在上述情况下,我想要一个 SQL,returns 从两个 table 记录,但是如果在 product_edits table 中找到产品仅从 product_edits 中选择,而不从 products table.

中选择

我尝试使用标准联合,但从 tables:

中选择了所有记录
select code, name, description from products
union
select code, name, description from product_edits
select code, name, description from products
where code not in(select code from product_edits)
union
select code, name, description from product_edits

在这种情况下,最好使用 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

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

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

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

第一部分将为您提供仅在产品 table 中的产品以及同时在 table 中但具有 product_edits.description.

的产品

第二部分会给你只有products_editstable的产品,因为union会去掉重复的记录