MySQL在同一列中查询具有相同第三个值并返回计数的2个值

时间:2012-09-16 20:48:53

标签: mysql

我正在尝试构建一个使用日志查询,该查询计算两个包同时用于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应用程序中呈现。提前谢谢。

1 个答案:

答案 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 bb matching a计为两个单独的匹配项)。之后,我们COUNT行数GROUP BY,这样我们就可以获得每个组合的计数。