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