执行计数后从数据库交换值

时间:2014-05-06 19:03:17

标签: mysql sql database

我知道我可以通过这样做从mysql算起来:

Select customer, Count (customer) Numbers from TblOrders group by customer 

我想计算每个客户在Order表中出现的次数。 之后,我想更新订单表,方法是将客户的客户ID与订户数最多的客户ID交换为另一位客户,ID = 1。

Customer | Numbers
1    | 5
2   | 18
3  | 0

所以这里最高的是C2,所以在执行另一次计数之后它现在将C1与C2交换,我应该得到下面的表格。

Customer | Numbers
1    | 18
2   | 5
3  | 0

我也知道交换可以通过我已完成的一些研究来完成。

Update TblOrders Set Customer = Case when 1 then 2
when 2 then 1
end
where TblOrders in (1, 2)

这句话的问题在于它假设我已经知道我交换的两个ID。但是如果我不知道,但我希望第二个是订单数量最多的ID ...我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

您希望发出UPDATE请求,该请求会影响属于所讨论的两个客户之一的所有行。所以基本的想法是:

UPDATE TblOrders
SET customer = IF(customer == 'C1', @MaxCust, 'C1')
WHERE customer IN ('C1', @MaxCust)

如果您的客户ID是整数,则可以将其缩写为

UPDATE TblOrders
SET customer = 1 + @MaxCust - customer
WHERE customer IN (1, @MaxCust)

这是有效的,因为a + b - a = ba + b - b = a,因此ab会被交换。

我的上述注释是使用用户变量@MaxCust来存储要交换的客户的ID。根据您的环境,您还可以使用应用程序代码在查询中输入正确的值。使用用户变量,您可以这样设置:

SELECT customer
FROM TblOrders GROUP BY customer
ORDER BY COUNT(*) DESC
LIMIT 1
INTO @MaxCust

答案 1 :(得分:0)

在看了@ MvG的解决方案之后,我想出了我自己的解决方案,如下所示。

SELECT customer FROM TblOrders GROUP BY customer ORDER BY COUNT(*) DESC LIMIT 1 INTO @MaxCust;

Update TblOrders Set Customer = Case 
when 1 then @MaxCust
when @MaxCust then 1 
end 
where TblOrders in (1, @MaxCust );