0

我不知道该怎么做..

我有一张这样的桌子:

account_categories
--------------------
id  | description
--------------------
34  | Home Services
35  | Home Services
36  | Home Services
39  | Home Design
40  | Home Design

我有另一个引用 account_categories.id 的表(帐户),它使用上述所有值。:/

我想展平 account_categories,所以我需要从 account_categories 中选择一个重复项并更新帐户,以便所有重复项都使用一个选定的值。

例如,我需要转这个:

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 和不同的描述:

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 中完成此操作。

有任何想法吗?

PS.,之后,我将遍历并从 account_categories 中删除帐户表中未使用 ID 的每一行。

4

1 回答 1

3

当我针对您上面发布的测试数据进行尝试时,这很有效。也就是说,在进行任何这样的大规模清理时,我建议先制作一份表格的副本。UPDATE还要在发布 之后和发布之前检查结果COMMIT

这是查询:

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 值(最低的值)。
  • 第一个连接 (to Account_Categories) 将每个帐户与其类别相关联,其唯一目的是提供可用的说明。
  • 第二个连接(到子查询)将帐户的现有描述与扁平化/重复数据删除描述表及其 ID 相关联。
于 2013-05-16T17:33:45.007 回答