Mysql SQL:聚合对而不加入(挑战性)

Mysql SQL:聚合对而不加入(挑战性),mysql,sql,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 | item

你能帮我解答一个很难的问题吗

我在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 |
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;
通常我们可以使用基于联接操作的查询,如:

| item1 | item2 | 2 |
| item1 | item3 | 1 |
| item2 | item3 | 1 |
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;
但它需要大量计算,在我的情况下,它是无用的,我有大约20万行。你能给我一个建议吗,还有别的方法吗?提前谢谢你

这是您的查询:

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;

假设每个用户ID只有几个项目,那么它的性能应该是合理的。

我不清楚您在这里要计算什么。是否要查看给定用户是否具有某些项?或者其他什么?您是否有另一个以itemid为主键的表项-参考表?每个用户都可以携带任意数量的项。对于每一对物品,我想计算同时携带这两件物品的用户数量。在示例中,配对item1和item2携带两个用户,配对item1和item3-只有一个。不,我没有引用表。但在我的情况下,构建它并不是一个问题,如果它有帮助的话。它将在两列中为您提供相同的结果!!这看起来像一个奇怪的奇迹!它起作用了!我应该更深入地理解如何使用索引。非常感谢你,伙计!