使用相关表中的数据查询设置值

时间:2018-04-02 16:09:27

标签: php mysql sql

所以,当我为salesreport设计一个看起来像这样的表时,我犯了一个大错误

+----+------------+--------------+-------+
| id | company_id | company_code | value |
+----+------------+--------------+-------+
|  1 |          0 |           67 |   100 |
|  2 |          0 |           55 |   200 |
+----+------------+--------------+-------+

我刚刚注意到这一点,并添加名为company_id的新列,该列位于公司表中,如下所示

+----+--------------+------+
| id | company_code | name |
+----+--------------+------+
|  1 |           55 | XX   |
|  2 |           67 | XA   |
+----+--------------+------+

过去我与company_code创建关系,因为我认为它始终是唯一的但不是自动递增,代码是从现有记录中的公司列表手动创建的。

然后我意识到最好使用id在表格之间建立关系,因此我的salesreport表格中应该company_code而不是company_id指向id 1}}公司表中的列

现在有超过一千条记录已经在mysql数据库中使用company_code引用关系,我想知道是否有一次mysql查询我可以运行来修复它?

我想出了这种查询

UPDATE salesreport SET company_id = '1' WHERE company_code = '67';

但我认为既然companysalesreport两个表已经有了关系,为什么它不能就这样呢

UPDATE salesreport SET company_id = company.id WHERE company_code = company.company_code;

但我不认为它会起作用,需要更多查询才能知道我选择company表然后将salesreport.company_codecompany.company_code匹配,如果匹配则设置salesreport.company_idcompany.id

。{

我觉得它是怎么回事......但是我不知道那个问题是什么...所以也许有人可以帮助我并为此提供一个懒惰的优雅解决方案。

顺便谢谢你。

4 个答案:

答案 0 :(得分:0)

使用联接更新到您的其他表

UPDATE salesreport s 
  LEFT JOIN company c on s.company_code = c.company_code
SET s.company_id = c.id;

答案 1 :(得分:0)

MERGE into salesreport S
USING(select id, company_code, name from Company) C
ON(S.company_code=C.company_code)
WHEN MATCHED THEN
UPDATE
SET S.company_id = C.id

你可以试试这个。当两个公司代码匹配时,这将使用公司表更新Salesreport表。

答案 2 :(得分:0)

您可以使用内部联接进行更新,例如:

  UPDATE salesreport s 
  INNER JOIN company c  ON s.company_code = c.company_code 
  set s.company_id = c.id

答案 3 :(得分:0)

以下是您的请求的解决方案:

a()

我为您创建了一个SQLFiddle来测试结果:http://rextester.com/HNJ85353

Herу是一个完整的测试用例:

UPDATE salesreport
LEFT JOIN company ON company.company_code = salesreport.company_code
SET salesreport.company_id = company.id;