2011-04-07 62 views
1

我有一个拥有项目列表的用户的数据库。
简单的设计:SQL - 通过动态权重查询

用户:

UserStuff |用户名

ItemsList:

ITEMID |用户ID

每个用户都有一个项目列表。一个Item可以属于许多用户(相同的itemID,不同的userID)。

现在我想给动态权重(在运行时计算,而不是常量,可以存储在数据库中),然后根据他们的项目选择权重最高的用户。

我可以给SQL查询中的项目赋予权重,然后进行计算吗?

我试图避免通过数据库循环和计算用户的权重。

编辑:

例如:

UserStuff | 用户标识
blah1 | 1
blah2 | 2

itemID | 用户标识
1 | 1
1 | 2
2 | 1
3 | 1
4 | 2
5 | 1个

wieghts:
的itemId = 1 = 15 ITEMID = 2 = 10

UserID1总重量= 25
UserID2总重量= 10

+0

你能不能用一个例子澄清? – SWeko 2011-04-07 08:59:53

+0

将计算权重所需的所有输入都存储在数据库中吗?或者应用程序/客户端是否必须专门提供这些值? – MatBailie 2011-04-07 12:02:36

+0

应用程序从外部计算权重。它不能从数据库中的信息计算。 – 2011-04-07 14:39:01

回答

4

创建的权重的一个临时表,与动态值:

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

创建一个视图项映射到权重:

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; 

选择权重最高的用户:

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

可以用视图或其他东西来代替临时表吗?如果有很多线程在工作并且执行相同的操作,那么这将会是一堆临时表。 – 2011-04-07 09:30:27

+3

+1,@Yochai Timmer:SQL数据库一直使用临时表,例如在进行连接,子查询或其他计算时。临时表在高度并发下运行良好。 – Andomar 2011-04-07 09:55:50