你能帮我解决一个非常棘手的问题吗?
我在MySQL DBMS中有一个表'itemslog',有两列:'userid'和'itemid',如下所示:
| user1 | item 1 |
| user1 | item 2 |
| user2 | item 1 |
| user2 | item 2 |
| user2 | item 3 |
我需要计算用户每对项目的数量,例如。这样回答:
| item1 | item2 | 2 |
| item1 | item3 | 1 |
| item2 | item3 | 1 |
通常我们可以使用基于JOIN操作的查询,例如:
SELECT
t1.itemname,
t2.itemname,
count(*)
FROM
itemslog AS t1
CROSS JOIN itemslog AS t2 ON t1.userid = t2.userid
WHERE
t1.itemname < t2.itemname
GROUP BY
t1.itemname, t2.itemname;
但它需要大量的计算,在我的情况下它是无用的(我有大约200k行)。你能给我一个建议吗,还有其他办法吗?提前谢谢!
答案 0 :(得分:1)
这是您的查询:
SELECT t1.itemname, t2.itemname, count(*)
FROM itemslog t1 JOIN
itemslog t2
ON t1.userid = t2.userid AND t1.itemname < t2.itemname
GROUP BY t1.itemname, t2.itemname;
对于此查询,您需要itemslog(userid, itemname)
上的索引:
create index itemslog_userid_itemname on itemslog(userid, itemname);
假设每个userid
只有少数项目,这应该具有合理的性能。