根据表B中的计数更新表A.

时间:2013-06-15 14:49:03

标签: mysql sql select

我有2张桌子(SALESMAN,SOLD),其中SALES表记录了每天售出的汽车。在晚上运行的作业必须增加SALESMAN表中的SOLD计数。例如,这是两个表:

SALESMAN                                SALES
+-------------+-----------+------+      +------------+---------+
| SALESMANID  |  NAME     | SOLD |      | SALESMANID | VEHICLE |
|          1  |  Bob      |    1 |      |          1 |      GM |
|          2  |  Charlie  |    7 |      |          1 |   Chrys |
|          3  |  Dave     |    0 |      |          1 |      GM |
+-------------+-----------+------+      |          3 |   Dodge |
                                        |          3 |      GM |
                                        |          2 |  Hummer |
                                        +------------+---------+

在UPDATE运行之后,Bob的销售数量将增加到4,Charlie的销售数量将增加到8,而Dave的销售数量将增加到2.我正在尝试创建类似的东西:

UPDATE SALESMAN SET SOLD=SOLD+( 
                                SELECT COUNT(*) 
                                FROM SALES 
                                WHERE SALESMAN.SALESMANID = SALES.SALESMANID
                              )

这是解决问题的正确方法吗?

我在这里找到了一个类似的问题:( Updating one SQL table based on data in another table)但是不清楚它是否会有选择地更新其示例中的表A或表A中的所有记录。


更新:我修正了上面的拼写错误,但它仍然无效。运行查询时影响了0行。

4 个答案:

答案 0 :(得分:0)

UPDATE SALESMAN a, 
       (SELECT SALESMANID, COUNT(*) SALE_COUNT 
        FROM SALES 
        group by SALESMANID) b 
set a.SOLD=a.SOLD+ b.SALE_COUNT 
WHERE a.SALESMANID = b.SALESMANID;

请参阅SQL Fiddle

答案 1 :(得分:0)

是的,你的查询只是改变了这个

 WHERE SALESAN.SALESMANID 

 WHERE SALESMAN.SALESMANID 

your demo

  • 我不知道为什么你在问问题之前没有尝试过自己。

答案 2 :(得分:0)

INSERT INTO SALESMAN (SALESMANID, SOLD) (SELECT SALEMANID, COUNT(*) as c FROM SOLD GROUP BY SALEMANID) ON DUPLICATE KEY UPDATE SOLD = c

您可能需要命名选择并使用.c

答案 3 :(得分:0)

如果在每晚进程运行后删除销售表,那么这应该有效

Update m Set
   Sold = sold + 
     (Select Count(*) From Sales
      Where SalesmanId = m.SalesmanId) 
From Salesman m