左联接两个表,如果两个表中都存在值,请保留右表中的最新值

时间:2019-06-15 14:47:18

标签: mysql

我正试图离开两个表。这部分很简单。

我有两个表:product和productupdate

产品表看起来像这样

id | productname | description 

productupdate表格如下

id | productname | descriptionupdate 

我简化了示例。有更多的列,而不仅仅是那些。

SELECT productname, description 
FROM product 
LEFT JOIN productupdate ON 
product.id =  productupdate.id WHERE id = ?

我想要实现的是连接两个表,如果右表(productupdate)中存在描述更新,则仅保留productupdate中的descriptionupdate,而不应保留product表中的描述。

如果我使用左联接,则右表中的所有内容将累加到左表中,并且一个产品将有多个描述。

我应该如何编写查询。

3 个答案:

答案 0 :(得分:0)

您可以使用COALESCE

SELECT p.productname, COALESCE(pu.descriptionupdate, p.description) AS desciption
FROM product p
LEFT JOIN productupdate pu ON p.id =  pu.id 
WHERE p.id = ?

答案 1 :(得分:0)

您可以尝试使用IF语句:IF descriptionupdate =''返回description列,否则返回descriptionupdate列。

然后,要加入所有描述,请按ID对结果进行分组,并对列进行组合。

SELECT IF (descriptionupdate='',description,descriptionupdate) as description
FROM product p
LEFT JOIN productupdate pu ON p.id =  pu.id 
WHERE p.id = ?
GROUP BY p.id
GROUP_CONCAT(description SEPARATOR ' ')

如果您不想对所有描述进行分组,而只是对最后一个描述进行分组,则删除分组部分并排序查询并限制结果

SELECT IF (descriptionupdate='',description,descriptionupdate) as description
FROM product p
LEFT JOIN productupdate pu ON p.id =  pu.id 
WHERE p.id = ?
ORDER BY orderColumnName DESC LIMIT 1

有关控制流功能的更多信息,请参见documentation

答案 2 :(得分:0)

productupdate中的日期列降序加入表格并进行排序,仅获得第一行:

SELECT 
  p.productname, 
  u.description
FROM product p LEFT JOIN productupdate u 
ON p.id =  u.id 
WHERE p.id = ?
ORDER BY u.datecolumn DESC 
LIMIT 1