Mysql 如何查询超过2列的计数

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 =>

我正在尝试编写一个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 => 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