mysql - 根据第三个 "key"表从两个表返回值,然后将值相乘并求和

标签 mysql join match case correlated-subquery

我有三个表:

值 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 |
+--------------------------------+

基于收购表中列出的交易
其中 BuyoutCostv.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/

相关文章:

JavaScript 正则表达式不起作用

mysql - 我可以从两行中取出结果并将它们合并为一行吗?

mysql - 带有 MySQL LEFT JOIN 的 WHERE 子句

mysql - SQL通过命名不同的表来连接

mysql - 根据条件连接两个表以及第二个表中的记录计数

R:找到匹配的字符串然后复制行

r 用于从地址中提取英国邮政编码的正则表达式未排序

php - 如何在 Laravel Eloquent 查询中收集项目?

mysql - 应用程序设计单个数据库与多个数据库

最佳匹配的MySQL搜索算法