Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:更新集,其中两者都由一个子选择决定_Mysql_Sql - Fatal编程技术网

MySQL:更新集,其中两者都由一个子选择决定

MySQL:更新集,其中两者都由一个子选择决定,mysql,sql,Mysql,Sql,我不知道怎么做 我有一张这样的桌子: account_categories -------------------- id | description -------------------- 34 | Home Services 35 | Home Services 36 | Home Services 39 | Home Design 40 | Home Design SELECT DISTINCT (description), id FROM crmalpha.account

我不知道怎么做

我有一张这样的桌子:

account_categories
--------------------
id  | description
--------------------
34  | Home Services
35  | Home Services
36  | Home Services
39  | Home Design
40  | Home Design
SELECT DISTINCT (description), id
FROM crmalpha.account_categories
GROUP BY description
for ( row in ( SELECT DISTINCT (description), id FROM crmalpha.account_categories GROUP BY description ) ) {
    UPDATE crmalpha.accounts SET accountCategory = $row['id'] WHERE accountCategory IN ( SELECT id FROM crmalpha.account_categories WHERE description = $row['description] )
}
我有另一个表(accounts),它引用account_categories.id,并使用上述所有值。:/

我想展平account_类别,因此我需要从account_类别中选择一个副本并更新accounts,以便所有副本都使用一个选定值

例如,我需要将此转换为:

accounts
---------------------
id  | accountCategory
---------------------
1   | 34
2   | 35
3   | 36
4   | 39
5   | 40
为此:

accounts
---------------------
id  | accountCategory
---------------------
1   | 34
2   | 34
3   | 34
4   | 39
5   | 39
我可以从以下帐户类别中选择id和不同的描述:

account_categories
--------------------
id  | description
--------------------
34  | Home Services
35  | Home Services
36  | Home Services
39  | Home Design
40  | Home Design
SELECT DISTINCT (description), id
FROM crmalpha.account_categories
GROUP BY description
for ( row in ( SELECT DISTINCT (description), id FROM crmalpha.account_categories GROUP BY description ) ) {
    UPDATE crmalpha.accounts SET accountCategory = $row['id'] WHERE accountCategory IN ( SELECT id FROM crmalpha.account_categories WHERE description = $row['description] )
}
但我想下一步是这样做:

account_categories
--------------------
id  | description
--------------------
34  | Home Services
35  | Home Services
36  | Home Services
39  | Home Design
40  | Home Design
SELECT DISTINCT (description), id
FROM crmalpha.account_categories
GROUP BY description
for ( row in ( SELECT DISTINCT (description), id FROM crmalpha.account_categories GROUP BY description ) ) {
    UPDATE crmalpha.accounts SET accountCategory = $row['id'] WHERE accountCategory IN ( SELECT id FROM crmalpha.account_categories WHERE description = $row['description] )
}
请原谅for循环和php变量伪代码,我只是想从逻辑上考虑一下。我不知道如何在纯SQL中实现这一点

有什么想法吗


另外,之后,我将检查并从accounts_类别中删除accounts表中未使用ID的每一行

当我试着用上面发布的测试数据做对比时,这个方法奏效了。也就是说,当进行任何类似这样的大规模清理时,我建议首先复制一个表。在发出
更新
之后和发出
提交
之前,还要检查结果

问题是:

UPDATE Accounts acct
INNER JOIN Account_Categories cat ON acct.AccountCategory = cat.id
INNER JOIN (
  SELECT MIN(id) AS NewID, Description
  FROM Account_Categories
  GROUP BY Description) NewCat ON cat.Description = NewCat.Description
SET acct.AccountCategory = NewCat.NewID
一些解释:

  • 子查询(
    SELECT MIN(id).
    )为每个描述获取一个id值(最低的)
  • 第一个连接(到
    帐户\类别
    )将每个帐户与其类别关联,唯一目的是使说明可用
  • 第二个联接(到子查询)将帐户的现有描述与展开/重复消除描述表及其ID相关联

当我针对您上面发布的测试数据进行测试时,它起到了作用。也就是说,当进行任何类似这样的大规模清理时,我建议首先复制一个表。在发出
更新
之后和发出
提交
之前,还要检查结果

问题是:

UPDATE Accounts acct
INNER JOIN Account_Categories cat ON acct.AccountCategory = cat.id
INNER JOIN (
  SELECT MIN(id) AS NewID, Description
  FROM Account_Categories
  GROUP BY Description) NewCat ON cat.Description = NewCat.Description
SET acct.AccountCategory = NewCat.NewID
一些解释:

  • 子查询(
    SELECT MIN(id).
    )为每个描述获取一个id值(最低的)
  • 第一个连接(到
    帐户\类别
    )将每个帐户与其类别关联,唯一目的是使说明可用
  • 第二个联接(到子查询)将帐户的现有描述与展开/重复消除描述表及其ID相关联

我确认了这一点。谢谢Ed,这真是太棒了。我将不得不对这个SQL进行第二次阅读,以尝试真正了解它。。。。明白了,再次谢谢!这是个好消息;我很高兴它对你有用!如果您有任何后续问题,请直接提问,我会尽力回答。我确认这是有效的。谢谢Ed,这真是太棒了。我将不得不对这个SQL进行第二次阅读,以尝试真正了解它。。。。明白了,再次谢谢!这是个好消息;我很高兴它对你有用!如果你有任何后续问题,尽管问,我会尽力回答。