Mysql 如何查询超过2列的计数
我正在尝试编写一个sql查询,显示两支球队相互比赛的频率Mysql 如何查询超过2列的计数,mysql,sql,Mysql,Sql,我正在尝试编写一个sql查询,显示两支球队相互比赛的频率 Id | Team1 | Team2 | Date 1 | A | B | 25/5/11 2 | B | A | 26/5/11 3 | A | C | 27/5/11 4 | C | B | 28/5/11 5 | A | B | 28/5/11 结果应该是: A vs B => 3 A vs C => 1 C vs B =>
Id | Team1 | Team2 | Date
1 | A | B | 25/5/11
2 | B | A | 26/5/11
3 | A | C | 27/5/11
4 | C | B | 28/5/11
5 | A | B | 28/5/11
结果应该是:
A vs B => 3
A vs C => 1
C vs B => 1
将A-B和B-A计算为不同是一个简单的查询。但我不能把它们算在一起
有什么建议吗
SELECT Team1, Team2, SUM(num) FROM (
SELECT Team1, Team2, COUNT(*) num
FROM table_name
GROUP BY Team1, Team2
UNION ALL
SELECT Team2, Team1, COUNT(*) num
FROM table_name
GROUP BY Team2, Team1
) combined
WHERE Team1 < Team2
GROUP BY Team1, Team2
编辑:必要时更新为反向团队
注意:这将比其他答案中给出的版本用例运行得快得多,因为它将充分利用索引
Edit2:使用索引将位置移动到更快的位置。在分组之前,我使用子查询对团队重新排序
SELECT first_team, second_team, count(*)
FROM (
SELECT
CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END AS first_team,
CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END AS second_team
FROM table
) a
GROUP BY first_team, second_team;
有几种方法可以实现您的目标:
SELECT Teams, Games = COUNT(*) FROM
(
SELECT
Teams = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END + ' vs ' +
CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END
FROM MY_TABLE
) AS T
GROUP BY Teams
以下是您可以使用的脚本:
/*或者,使用此选项仅切换列*/
/* STYLE 3 */
;WITH T AS (
SELECT
Team1 = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END
, Team2 = CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END
FROM @t
)
SELECT Team1 , Team2, Games = COUNT(*) FROM T GROUP BY Team1 , Team2
/* STYLE 4 */
SELECT Team1 , Team2, Games = COUNT(*) FROM
(
SELECT
Team1 = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END
, Team2 = CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END
FROM @t
) AS T
GROUP BY Team1 , Team2
团队名称可以是任何名称。我用A和B写得更快。有代表每个团队的数字吗?来自团队表的ie?您使用的是什么版本的SQL?在这种情况下,我将MySql用于我的live数据库…这不会给出正确的结果。在该查询中,a->B和B->a之间存在区别。OP正在寻找A vs B与B vs A的组合。表格可能会变得相当大。。。所以可能需要使用索引。。。谢谢..@Sorskoot在Team1和Team2上添加了两个索引:Team1和Team2上添加了第二个索引,Team1I对其进行了编辑,使其使用索引时更快。where实际上是可选的-如果不使用它,每个分组将得到两次-这会很有帮助,因为您只需要在Team1列中搜索特定的团队,而不必为该团队同时检查两列。@Ariel-我认为您给服务器带来了一些不必要的负担。看一看我的帖子,查看标有Style4的部分。根据执行计划,这应该快60%左右。这是可行的,但它根本不使用索引,所以如果有很多团队,请使用我的答案。
;WITH T AS (
SELECT
Teams = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END + ' vs ' +
CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END
FROM MY_TABLE
)
SELECT Teams, Games = COUNT(*) FROM T GROUP BY Teams
/*
Teams Games
-------|------
A vs B 3
A vs C 1
B vs C 1
*/
/* TEST DATA */
DECLARE @t AS TABLE ( ID INT, Team1 CHAR(1), Team2 CHAR(1), playdate [DATETIME] )
INSERT INTO @t (Team1 , Team2 , playdate)
SELECT 'A' , 'B', '20110525'
UNION ALL SELECT 'B' , 'A', '20110526'
UNION ALL SELECT 'A' , 'C', '20110527'
UNION ALL SELECT 'C' , 'B', '20110528'
UNION ALL SELECT 'A' , 'B', '20110528'
/* STYLE 1 */
;WITH T AS (
SELECT
Teams = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END + ' vs ' +
CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END
FROM @t
)
SELECT Teams, Games = COUNT(*) FROM T GROUP BY Teams
/* STYLE 2 */
SELECT Teams, Games = COUNT(*) FROM
(
SELECT
Teams = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END + ' vs ' +
CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END
FROM @t
) AS T
GROUP BY Teams
/* STYLE 3 */
;WITH T AS (
SELECT
Team1 = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END
, Team2 = CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END
FROM @t
)
SELECT Team1 , Team2, Games = COUNT(*) FROM T GROUP BY Team1 , Team2
/* STYLE 4 */
SELECT Team1 , Team2, Games = COUNT(*) FROM
(
SELECT
Team1 = CASE WHEN Team1 < Team2 THEN Team1 ELSE Team2 END
, Team2 = CASE WHEN Team1 < Team2 THEN Team2 ELSE Team1 END
FROM @t
) AS T
GROUP BY Team1 , Team2