mysql - 使用另一个表中的数据更新表数据

标签 mysql

我正在尝试用另一个表中的数据更新一个表,两个表之间的关系, 是一对多的关系。我在这里举了一个例子:

UPDATE
    foo f
INNER JOIN 
    bar b 
ON 
    b.fooId = f.Id 
SET
    f.something1 = b.barSome1,
    f.something2 = b.barSome1, 
    f.something3 =  b.barSome1, 
    f.something4 = b.barSome1

但是我的例子只做了一半, 我想要做的是根据最新选择前 1 个栏 bar.post_date 或 bar.Id 或检查 bar.barSome1(假设它是一个 varchar)是否为 null 或为空。

现在是我酒吧的一些内部订单

最佳答案

因此您需要添加一个 WHERE 子句来限制哪些 foo 行被修改。

UPDATE
    foo f
INNER JOIN 
    bar b 
ON 
    b.fooId = f.Id 
SET
    f.something1 = b.barSome1,
    f.something2 = b.barSome1, 
    f.something3 =  b.barSome1, 
    f.something4 = b.barSome1
WHERE 
  /* only the latest foo.Id */
  f.Id = (SELECT MAX(Id) FROM foo)
  /* Or f.barSome1 is NULL or an empty string */
  OR (f.barSome1 IS NULL OR f.barSome1 = '')

要在最新的 post_date 之前完成,请使用如下结构:

WHERE
  f.id = (SELECT id FROM (SELECT id, post_date FROM foo HAVING post_date = MAX(post_date)) AS maxpost)
  OR (f.barSome1 IS NULL OR f.barSome1 = '')

更新

要使用 bar 的单行中的匹配条件修改 foo 的所有行,您可以对没有 ON 的子查询使用连接> 条款。首先使用 SELECT 语句对此进行测试。 我从来没有尝试过这样的事情,如果它破坏了你的 foo 表,我不承担任何责任。 :) 先备份。

测试连接

SELECT f.*, barsub.*
FROM 
  foo f
  JOIN (SELECT * FROM bar WHERE Id = (SELECT MAX(Id) FROM bar)) barsub

更新应该以同样的方式工作

UPDATE foo f
/* subquery returns one row so all rows of foo are joined to it */
JOIN (SELECT * FROM bar WHERE Id = (SELECT MAX(Id) FROM bar)) barsub
/* no ON clause */
SET
   f.something1 = barsub.barSome1,
   f.something2 = barsub.barSome1, 
   f.something3 = barsub.barSome1, 
   f.something4 = barsub.barSome1

关于mysql - 使用另一个表中的数据更新表数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10107674/

相关文章:

mysql - 在 ORDER BY 中使用 'case' (MySQL)

mysql - SQL LAG 和 Over 函数返回错误 #1064

PHP、MySQL、IIS7.5 对于简单的查询来说花费的时间太长了

Mysql Select From Select 语法

php - "Time ago"来自 MySQL 时间戳

javascript - 如何使用表单中的输入变量来更新另一个 php 的图表?

javascript - Ajax "Is there new content? If so, update page"- 如何在不破坏服务器的情况下执行此操作?

php - 多图片上传无法将描述保存到数据库中。如何解决这个问题?

PHP + MySQL - 随机列出MySQL表中的所有数据

mysql - 找不到MySQL语法错误