【问题标题】:Find repeated battles寻找重复的战斗
【发布时间】:2013-11-06 04:13:52
【问题描述】:

我有一个包含以下字段的表格:

battle_id, winner, looser  
 1  200    44  
 2   55   366  
 3   44   200  
 4  123   200  
 5  200    44  
 6   55   366  
 7  177   205  
 8  188   211  
 9  366    55  
10   55   366

目前它有大约1300条记录(很小),大约有400名玩家,每场战斗只能是赢家和输家(没有平局)

我怎样才能找到所有重复的战斗?我不想找到一个玩家的所有重复战斗,我想知道所有玩家的所有重复战斗......我知道我可以在 php 中创建一个递归函数,迭代所有战斗并分配它们到一个矩阵,但只是为了好玩...有没有办法只在 mysql 上做到这一点?

而我如何优化表格以更快地找到重复的战斗?

问候

编辑:

例如,我希望查询显示:

battle_id, winner, looser  
 1  200    44  
 2   55   366  
 3   44   200  
 5  200    44  
 6   55   366  
 9  366    55  
10   55   366

【问题讨论】:

  • 如何定义“连连战”?所有参与者都一样吗?您在 SQL 中的表布局是什么(存在哪些字段以及它们使用了哪些数据类型,等等)?
  • 抱歉。他们赢了还是输了
  • 是的......球员是否也交换位置也没关系......我也想看到他们
  • @Chico3001 检查我的更新答案
  • 我只是希望得到一个正确拼写“失败者”的答案,以便我可以投票。

标签: mysql sql recursive-query


【解决方案1】:

这应该可行,使用自联接可能会导致许多重复条目

SQLFIDDLE

SELECT
    t1.battle_id,
    t1.winner,
    t1.loser
FROM
    your_table t1
WHERE
    EXISTS (
             SELECT
                 1
             FROM
                 your_table t2
             WHERE
                 ( ( t1.winner = t2.winner
                 AND t1.loser = t2.loser )
                 OR ( t1.loser = t2.winner
                 AND t1.winner = t2.loser ) )
                 AND t1.battle_id <> t2.battle_id
    )

【讨论】:

  • 在我的答案中添加了 DISTINCT,它现在不应该再显示重复项了;)当然,您的答案也应该有效 - 我只是开始讨厌子查询。至于性能,您的答案可能更有效,因为您没有构建整个笛卡尔积。
  • 另外,请参阅 gloomy.penguin 的回答,了解您的查询为何不起作用。 ;) 因为它仍然是一个自引用,所以每个条目都匹配自己。
  • OP 我猜需要重复项,在 JOIN 中添加 distinct 子句会隐藏所有这些,而不添加它会导致所有匹配行的笛卡尔积。因此我决定使用EXITS 子句
  • 不行...也不行,只显示同一张桌子,不只显示重复的战斗
  • 是的,和我的回答一样的错误;)
【解决方案2】:

试试这个:

SELECT b1.battle_id,
       b1.winner,
       b1.looser 
FROM   battles as b1
group  by b1.battle_id, b1.winner,  b1.looser 
having count(*)>=2

【讨论】:

  • 你是对的,现在当我看到你的查询时,我得到了我的错误。删除了我的答案。您仍可能希望添加 DISTINCT 关键字以消除结果中的重复项。
  • @JohannesH。您不必删除您的...我不需要 distinct 因为我正在使用 group by 并拥有。我参加聚会迟到了……我的回答可能是错误的,哈哈……不知道!我没有测试。
  • 当然我没必要。但由于它与您的建议几乎相同,只是内置了一个额外的错误 - 出于什么原因应该在此处列出?
猜你喜欢
  • 2015-09-27
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
相关资源
最近更新 更多