2013-07-27 1 views
0

I ont trois tables:valeurs de retour de deux tables à partir d'une troisième table "clé", puis en multipliant les valeurs et la somme des produits

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

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

Buyout b

+------------------+ 
| Owner | Buyer | 
+------------------+ 
|Bob | Bill | 
|Bob | Kyle | 
|Dale | Jan | 
|Dale | Bill | 
|Rick | Kyle | 
|Rick | Jan | 
+------------------+ 

Ce que je suis à la recherche est une quatrième table:

PossibleBuyouts

+--------------------------------+ 
| Owner | Buyer | BuyoutCost | 
+--------------------------------+ 

sur la base des opérations prévues dans le tableau Buyout
BuyoutCost est la somme de v.Value * p.Percentage
pour chaque Location
le Buyer et le Owner ont en commun.

Ainsi, ces exemples retourneraient une table PossibleBuyouts de

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

pose la première ligne à titre d'exemple, les travaux mathématiques comme ceci:

-Bob et Bill deux ont des emplacements A1 et B4 en commun
la valeur de la propriété de -Bob pour A1 est de 0,25 et le projet de loi veut 0,10 pour cent
-le coût pour A1 serait (0,25 * 0,10) = 0,025
la valeur de la propriété de -Bob pour B4 est de 0,10 et le projet de loi veut 0.20%
-le coût pour B4 serait (0.10 * 0.20) = 0.020
-Somme (0.025 + 0.020) = le BuyoutCost de 0.045. Si vous pouvez m'aider, je cherche le moyen le plus efficace de le faire - qu'il s'agisse de plusieurs requêtes, une requête avec un groupe de sous-requêtes, ce qui devrait prendre le moins de temps possible. Il ya ~ 1500 propriétaires différents, ~ 1000 acheteurs différents et ~ 500 emplacements différents, de sorte que le nombre de combinaisons possibles conduit à des temps de requête looooooong. Que pensez-vous sera le moyen le plus rapide de le faire? Tout est indexé et les données réduites à la plus petite taille que je peux l'obtenir.

Répondre

0

Je vous recommande de créer une procédure qui utilise un curseur pour atteindre votre objectif. Itérer sur l'un des trois tableaux, ce devrait être un processus assez simple.

MySQL Curseurs: http://dev.mysql.com/doc/refman/5.0/en/cursors.html

Edit: Le script MySQL stocké suivant crée et appelle une procédure stockée qui reproduit correctement les résultats que vous recherchez:

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(); 

Hope qui aide. Aux tailles de table que vous avez mentionnées, cela devrait se terminer extrêmement rapidement.

+0

Ok, avez-vous fait des recherches et cela semble logique - je suis assez nouveau dans les bases de données et mysql cependant - aider à l'apparence de ce code? – Rocky

+0

Ajout d'un SP complet qui recrée la solution pour vos données d'exemple. S'il vous plaît allez-y attentivement et tester pour s'assurer qu'il fait ce que vous attendez de faire. –

+0

Génial, cela a fait l'affaire. La seule chose que je devais corriger était la requête quittant la boucle chaque fois qu'il n'y avait pas de correspondance de localisation pour un ensemble donné de propriétaire et d'acheteur. Cette fois-ci, j'ai été capable d'éliminer ces ensembles de la table avant d'exécuter la requête, mais de toute évidence, ce n'est pas une vraie solution - comment vous y prendrez-vous de la bonne façon? Merci pour l'aide! – Rocky

Questions connexes