在where子句中组合两个子查询的好方法

hc2pp10m  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(369)

我有这个模式:

CLUB(Name, Address, City)
TEAM(TeamName, club)
PLAYER(Badge, teamName)
MATCH(matchNumber, player1, player2, club, winner)

我需要提出这个问题:
对于每个俱乐部,找出该俱乐部中至少赢得两场比赛的球员人数。
我写了这个:

SELECT teamName
From TEAM t join Match m1 on t.club=m1.club
WHERE Q2 >= ALL Q1

问题1:

SELECT Count (Distinct winner)
FROM MATCH
WHERE match m join player p on m. winner=player.badge
GROUP BY teamName

问题2:

SELECT Count (distinct winner)
FROM match m2
WHERE m2.club=m1.club

我不知道这是不是正确的,但是我听说用这种形式,我面对两个计数不是最好的。为什么?

t1rydlwq

t1rydlwq1#

尝试以下操作:

SELECT club, COUNT(*) as PlayerCount
FROM (SELECT club, winner
      FROM match
      GROUP BY club, winner
      HAVING COUNT(*) > 1) a
GROUP BY club

内部查询应将结果限制为有2个或更多胜利的俱乐部/球员组合,外部查询将统计每个俱乐部的这些球员的数量。
我不知道这是不是正确的,但是我听说用这种形式,我面对两个计数不是最好的。为什么?
如果需要,比较两个count子查询是可以的,但是一个好的经验法则是尽可能少地命中每个表。使用多个子查询最终会多次命中每个表,并且通常会导致更长的执行时间。

mrwjdhj3

mrwjdhj32#

尝试此查询

SELECT t.club, COUNT(*)
FROM TEAM t
JOIN PLAYER p ON p.teamName = t.TeamName
JOIN (
    -- Won at least 2 matches.
    SELECT club, winner, COUNT(*) AS TheCount
    FROM MATCH
    GROUP BY club, winner
    HAVING COUNT(*) > 1
) w ON w.winner = p.badge AND w.club = t.club
GROUP BY t.club

相关问题