1

我正在尝试为使用日志构建一个查询,该查询计算两个包同时用于 uploadID 的次数。换句话说,我想知道每个uploadID 出现2 个包的次数。这是我将数据存储在 MySQL 中的表的示例。

uploadID  package  
1         value1
1         value2
1         value3

2         value2
2         value3
2         value4

3         value1
3         value3
3         value4

4         value1
4         value3
4         value4

我正在寻找的输出将是这样的:

Concurrent Packages    Count
value1 & value2          1
value1 & value3          3
value1 & value4          2
value2 & value3          2
value2 & value4          1  
value3 & value4          3

我已经尝试了许多查询来实现这一点,但似乎没有任何效果。理想情况下,一旦我得到计数​​,我想将输出放在矩阵中,如下所示:

        value1  value2  value3  value4
value1    -       1       3       2
value2    1       -       2       1     
value3    3       2       -       3
value4    2       1       3       -

我真的很感激任何关于如何实现这一目标的建议。数据存储在 MySQL 数据库中,但最终矩阵将在 PHP Web 应用程序中呈现。提前致谢。

4

1 回答 1

3

第一个版本保持简单,这应该可以满足您的需求;

SELECT CONCAT(a.package, ' & ', b.package) "Concurrent Packages",
       COUNT(*) "Count"
FROM packages a
CROSS JOIN packages b
WHERE a.package<b.package AND a.uploadid=b.uploadid
GROUP BY a.package,b.package
ORDER BY a.package,b.package

SQLFiddle在这里

至于第二个版本,它可以用 MySQL 完成,但解决方案变得相当复杂。如果您想尝试一下,这里有可以帮助您入门的信息。

查询的简短说明;表和自身之间的CROSS JOIN将返回所有行组合。我们过滤掉,以便我们只计算值是字母顺序并且uploadid匹配的那些WHERE(字母顺序只是为了避免这种情况a matching bb matching a计为两个单独的匹配项)。之后,我们COUNT计算行数和GROUP BY值,因此我们得到每个组合的计数。

于 2012-09-16T21:24:43.060 回答