我有三个表:
值 v
+-------------------------------+
| Owner | Location | Value |
+-------------------------------+
|Bob | A1 | 0.25 |
|Bob | B4 | 0.10 |
|Dale | Z3 | 0.50 |
|Dale | A1 | 0.25 |
|Rick | B4 | 0.10 |
|Rick | Z3 | 0.50 |
+-------------------------------+
购买百分比p
+-------------------------------+
| Buyer | Location | Percentage |
+-------------------------------+
|Bill | A1 | 0.10 |
|Bill | B4 | 0.20 |
|Kyle | Z3 | 0.30 |
|Kyle | A1 | 0.50 |
|Jan | B4 | 0.15 |
|Jan | Z3 | 0.25 |
+-------------------------------+
收购b
+------------------+
| Owner | Buyer |
+------------------+
|Bob | Bill |
|Bob | Kyle |
|Dale | Jan |
|Dale | Bill |
|Rick | Kyle |
|Rick | Jan |
+------------------+
我正在寻找的是第四个表:
可能的收购
+--------------------------------+
| Owner | Buyer | BuyoutCost |
+--------------------------------+
基于收购
表中列出的交易
其中 BuyoutCost
是 v.Value
* p.Percentage
对于每个不同的位置
买方
和所有者
有共同点。
因此,这些示例将返回一个 PossibleBuyouts
表,其中包含
+--------------------------------+
| Owner | Buyer | BuyoutCost |
+--------------------------------+
|Bob | Bill | 0.045 |
|Bob | Kyle | 0.125 |
|Dale | Jan | 0.125 |
|Dale | Bill | 0.025 |
|Rick | Kyle | 0.150 |
|Rick | Jan | 0.140 |
+--------------------------------+
以第一行为例,数学计算如下:
-Bob 和 Bill 都有共同的位置 A1 和 B4
-Bob 对 A1 的所有权值为 0.25,Bill 想要 0.10%
-A1 的成本为 (0.25*0.10) = 0.025
-Bob 对 B4 的所有权值(value)是 0.10,而 Bill 想要 0.20%
-B4 的成本为 (0.10*0.20) = 0.020
-Sum(0.025 + 0.020) = 买断成本 0.045。
如果你能帮助我,我正在寻找最有效的方法来做到这一点 - 无论是多个查询、一个带有一堆子查询的查询,还是花费最少时间的任何方法。
大约有 1500 个不同的所有者、大约 1000 个不同的买家和大约 500 个不同的地点,因此潜在组合的数量会导致查询时间过长。您认为最快的方法是什么?所有内容都已编入索引,并且数据被削减到我可以获得的最小大小。
最佳答案
我建议您创建一个使用光标来实现目标的过程。迭代三个表之一,这应该是一个非常简单的过程。
MySQL 游标:http://dev.mysql.com/doc/refman/5.0/en/cursors.html
编辑:以下存储的 MySQL 脚本创建并调用一个存储过程,该过程可以正确重现您正在查找的结果:
DELIMITER $$
DROP PROCEDURE IF EXISTS `computeBuyouts` $$
CREATE PROCEDURE `computeBuyouts` ()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE o, b VARCHAR(32);
DECLARE bc FLOAT;
DECLARE cur CURSOR FOR SELECT Owner,Buyer FROM Buyout;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO o, b;
IF done THEN
LEAVE read_loop;
END IF;
SET bc = 0;
-- compute the sum of products of each value/percentage pair for all locations
SELECT SUM(v.Value * pp.Percentage) INTO bc FROM Value v LEFT JOIN (PurchasePercentage pp) ON (v.Location = pp.Location) where v.Owner = o and pp.Buyer = b group by v.Owner;
INSERT INTO PossibleBuyouts VALUES (o, b, bc);
END LOOP;
CLOSE cur;
END $$
DELIMITER ;
CALL computeBuyouts();
希望有帮助。按照您提到的表格大小,这应该非常快地完成。
关于mysql - 根据第三个 "key"表从两个表返回值,然后将值相乘并求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17903389/