SQL:聚合没有JOIN的对(具有挑战性)

时间:2016-10-02 07:11:29

标签: mysql sql

你能帮我解决一个非常棘手的问题吗?

我在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行)。你能给我一个建议吗,还有其他办法吗?提前谢谢!

1 个答案:

答案 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只有少数项目,这应该具有合理的性能。