【问题标题】:RIGHT JOIN or UNION with MySQL与 MySQL 的 RIGHT JOIN 或 UNION
【发布时间】:2014-08-03 03:13:42
【问题描述】:

我有一张桌子:

+----+--------+-------+
| ID | Winner | Loser |
+----+--------+-------+
|  1 |      1 |     4 |
|  5 |      1 |     2 |
|  6 |      1 |     3 |
|  3 |      2 |     3 |
|  4 |      2 |     4 |
|  2 |      3 |     4 |
+----+--------+-------+

赢家和输家都是另一个表中的 ITEM ID。

我正在尝试实现返回列的查询: 项目 ID、CountWinners、CountLosers。

目的是,对于每个 itemID,该项目将赢得 X 场比赛和失败 Y 场比赛。如果有平局,我可以按损失排序

SELECT t1.ID, t1.WinnerCount, t2.ID, t2.LoserCount from
(Select winner as ID, count(winner) as WinnerCount from rp_poss group by winner) as t1
FULL OUTER JOIN
(Select loser as ID, count(loser) as LoserCount from rp_poss group by loser) as t2
ON t1.ID=t2.ID

返回:

+------+-------------+----+------------+
|  ID  | WinnerCount | ID | LoserCount |
+------+-------------+----+------------+
| 2    | 2           |  2 |          1 |
| 3    | 1           |  3 |          2 |
| NULL | NULL        |  4 |          3 |
+------+-------------+----+------------+

而不是

+----+-------------+------------+
| ID | WinnerCount | LoserCount |
+----+-------------+------------+
|  1 |           3 | 0          |
|  2 |           2 | 1          |
|  3 |           1 | 2          |
|  4 |           0 | 3          |
+----+-------------+------------+

我尝试使用 UNION ALL,但无法使其正常工作。有什么想法吗?

【问题讨论】:

  • 列有点混乱 - 顶部表格中的 ID 列实际上并未在输出中使用? (我看到了获胜者/失败者的聚合组,但与 ID 没有关系)
  • @michaelberkowski 他的意思是赢家/输家中的整数所代表的人

标签: mysql sql join union


【解决方案1】:

我会使用这样的联合(使用条件聚合):

小提琴: http://sqlfiddle.com/#!2/27ef6/3/0

select person as id,
       sum(case when result = 'W' then 1 else 0 end) as winnercount,
       sum(case when result = 'L' then 1 else 0 end) as losercount
  from (select winner as person, 'W' as result
          from rp_poss
        union all
        select loser, 'L'
          from rp_poss) x
group by person

【讨论】:

    【解决方案2】:
    select t_all.id, 
     coalesce(WinnerCount,0) WinnerCount, 
     coalesce(LoserCount,0) LoserCount
    from (select distinct winner id from mytable
    union select distinct loser id from mytable) t_all
    left join (select winner, count(*) WinnerCount
        from mytable group by winner) winners on t_all.id = winners.winner
    left join (select loser, count(*) LoserCount
        from mytable group by loser) losers on t_all.id = losers.loser
    order by WinnerCount, LoserCount
    

    【讨论】:

      【解决方案3】:

      既然你提到你有另一个带有IDs 的表,我会在我的解决方案中使用它

      SELECT t1.id, COUNT(w.id), COUNT(l.id) 
      FROM TableOfIDs t
      LEFT JOIN YourTable w ON t.id = w.id
      LEFT JOIN YourTable l ON i.id = l.id
      GROUP BY t1.id
      

      这样您可以简化查询。

      如果 other 表的 ID 多于您的 Winner/Looser 表中的 ID,我们可以使用 HAVING 子句消除不必要的零。

      HAVING COUNT(w.id)+COUNT(i.id) > 0
      

      【讨论】:

        【解决方案4】:

        试试这个

        SELECT ID ,Coalesce(Winners,0),Coalesce(Loosers,0)
        FROM (
                SELECT ID , 
                            ( SELECT Count(Winner) FROM rp_poss WHERE WINNER=A.ID GROUP BY Winner ) Winners,
                            ( SELECT Count(Looser) FROM rp_poss WHERE Looser=A.ID GROUP BY Looser ) Loosers                     
                FROM rp_poss A
        ) result
        WHERE Winners > 0 OR Loosers > 0
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-27
          • 2016-10-21
          • 1970-01-01
          • 1970-01-01
          • 2018-10-21
          • 1970-01-01
          • 2013-10-07
          • 1970-01-01
          相关资源
          最近更新 更多