我正在尝试构建一个使用日志查询,该查询计算两个包同时用于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应用程序中呈现。提前谢谢。
答案 0 :(得分: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 here。
对于第二个版本,可以完成MySQL,但解决方案变得更加复杂。如果你想尝试一下,info here会让你开始。
查询的简短说明;表与自身之间的CROSS JOIN
将返回行的所有组合。我们会过滤掉,以便我们只计算值为字母且值为WHERE
的uploadid匹配值(字母表只是为了避免将a matching b
和b matching a
计为两个单独的匹配项)。之后,我们COUNT
行数GROUP BY
,这样我们就可以获得每个组合的计数。