2012-03-01 38 views
3

我试图设置一个行值为1,当它是一个组中唯一的一行,与一个单一的查询。如何仅更新值WHERE COUNT(使用GROUP BY的子查询)= 1?

当前表(CATEGORY_BRAND):

|categoryId | brandId | featured | 
|-----------+---------+----------| 
| 1   | 100  | -1  | 
| 1   | 101  | -1  | 
| 1   | 102  | -1  | 
| 2   | 100  | -1  | 
| 3   | 110  | -1  | 
| 3   | 111  | -1  | 
| 4   | 102  | -1  | 
| 5   | 101  | -1  | 
| 6   | 100  | -1  | 
| 6   | 110  | -1  | 
| ...  | ...  | ...  | 

希望的结果(CATEGORY_BRAND):

|categoryId | brandId | featured | 
|-----------+---------+----------| 
| 1   | 100  | -1  | 
| 1   | 101  | -1  | 
| 1   | 102  | -1  | 
| 2   | 100  | 1  | 
| 3   | 110  | -1  | 
| 3   | 111  | -1  | 
| 4   | 102  | 1  | 
| 5   | 101  | 1  | 
| 6   | 100  | -1  | 
| 6   | 110  | -1  | 
| ...  | ...  | ...  | 

(我最诚挚的道歉,如果这是一个重复的,我找不到其他人做的像这样的更新。)

回答

3

这可能不是最高性能,但应该工作(尽管你应该先测试它)。

UPDATE category_brand JOIN (
    SELECT categoryId 
    FROM category_brand 
    GROUP BY categoryId 
    HAVING COUNT(categoryId) = 1) 
    AS single_cbs USING(categoryId) SET category_brand.featured = 1; 
+0

太棒了!奇迹般有效。我已经完成并手动检查了数据库中的行,这正是我正在寻找的。 :D – 2012-03-01 22:46:13

+0

好东西。从其他答案中可以看出,您不能在子查询中引用要修改的表。因此'加入'救援。 – 2012-03-01 22:49:41