2011-04-07 6 views
1

J'ai une base de données avec les utilisateurs qui ont une liste d'éléments.
conception simple:SQL - requête par poids dynamiques

utilisateurs:

UserStuff | UserID

itemsList:

itemID | ID utilisateur

Chaque utilisateur possède une liste d'éléments. Un article peut appartenir à plusieurs utilisateurs (même ID article, ID utilisateur différent).

Maintenant, je veux donner dynamiquement aux éléments (calculés au moment de l'exécution, pas quelque chose de constant qui peut être stocké dans la base de données), puis sélectionnez les utilisateurs avec les poids les plus élevés en fonction de leurs éléments. Puis-je donner le poids aux éléments d'une requête SQL, puis effectuer le calcul? J'essaie d'éviter de boucler dans la base de données et de calculer le poids des utilisateurs.

Edit:

exemple:

UserStuff | ID utilisateur
blah1 | 1
blah2 | 2

itemID | ID utilisateur
1 | 1
1 | 2
2 | 1
3 | 1
4 | 2
5 | 1

wieghts:
itemId = 1 = 15 itemID = 2 = 10

UserID1 poids total = 25
UserID2 poids total = 10

+0

Pourriez-vous préciser un exemple? – SWeko

+0

Toutes les entrées nécessaires au calcul des poids seront-elles stockées dans la base de données? Ou l'application/le client doit-il fournir spécifiquement ces valeurs? – MatBailie

+0

L'application calcule les poids de manière externe. Il ne peut pas être calculé à partir des informations contenues dans la base de données. –

Répondre

4

créer une table temporaire de poids, avec la dynamique valeurs:

CREATE TEMPORARY TABLE weights(item_id integer, weight integer); 
CREATE TABLE 
INSERT INTO weights VALUES (1, 10); -- Inserting weights 
INSERT 0 1 
INSERT INTO weights VALUES (2, 1); -- Inserting weights 
INSERT 0 1 
... 

Créer une vue à la carte: les articles à poids

CREATE TEMPORARY VIEW items_weights AS 
     SELECT il.itemID, il.UserID, w.weight FROM 
       ItemsList il JOIN weights w 
       ON il.itemID=w.item_id; 

Sélectionnez les utilisateurs le plus de poids:

SELECT UserId, COUNT(weight) FROM items_weights 
     GROUP BY UserId ORDER BY COUNT(weight) DESC; 
+0

Peut-il être fait avec une vue ou quelque chose au lieu d'une table temporaire? S'il y a beaucoup de threads qui travaillent et font la même chose, ce sera un tas de tables temporaires. –

+3

+1, @Yochai Timmer: Les bases de données SQL fonctionnent avec des tables temporaires tout le temps, par exemple lors d'une jointure, d'une sous-requête ou d'un autre calcul. Les tables temporaires fonctionnent bien sous une concurrence intense. – Andomar

Questions connexes