Mysql Update,其中Count Distinct返回多行

时间:2014-10-02 04:51:32

标签: mysql

我有两个表,第一个带有指南名称,章节和主题的列表,随着时间的推移,当添加新指南时,有或没有相同的名称,我们称之为“指南”,类似于:

|---Name---|---Chapter---|---Topic---|
|The Hearth| 1           |Educational|
|The Hearth| 2           |Educational|
|The Hearth| 3           |Educational|
|The Brain | 1           |Maths      |

和另一个表格,我为每个指南分配一个ID,让我们称之为“简历”,类似这样的

|---id---|---Name---|---Topic---|
| 1      |The Hearth|Educational|
| 2      |The Brain |Maths      |

现在,当“指南”中添加了相同名称的指南时,它有一个难题,如:

|---Name---|---Chapter---|---Topic---|
|The Hearth| 4           |Tales      |

我需要将“简历”表更新为:

|---id---|---Name---|---Topic---|
| 1      |The Hearth|MIXED      |
| 2      |The Brain |Maths      |

我一直在尝试不同的方式,这是我到目前为止所做的:

UPDATE resume J INNER JOIN guides P ON J.name = P.name SET J.topic = "Mixed" 
WHERE     J.topic != P.topic AND (SELECT COUNT(DISTINCT a.topic)
FROM     guides a
JOIN   guides   b
ON a.name = b.name
AND a.topic != b.topic     
GROUP BY a.name
HAVING COUNT(DISTINCT a.topic) > 1)

只有一条记录时,一切正常,但如果添加了两条带有dif主题的指南,则子查询返回多行并且不进行更新。我知道我可以通过php循环来解决这个问题,但我确定必须有一种方法来处理查询本身,我会很感激这一点。

提前致谢

1 个答案:

答案 0 :(得分:2)

您可以先执行选择计数,然后再加入以优化查询速度:

UPDATE resume J
INNER JOIN (
SELECT COUNT(DISTINCT A.topic) AS num, A.name
FROM guides A 
GROUP BY A.name
HAVING COUNT(DISTINCT A.topic)>1) AS P ON J.name = P.name
SET J.topic = "Mixed"