【问题标题】:Exclude results on basis of test cases根据测试用例排除结果
【发布时间】:2016-12-31 11:20:47
【问题描述】:

编写查询以打印hacker_id、姓名和每个学生创建的挑战总数。按挑战总数降序排列您的结果。如果多个学生创建了相同数量的挑战,则按hacker_id 对结果进行排序。如果多个学生创建了相同数量的挑战,并且计数小于创建的最大挑战数量,则将这些学生排除在结果之外。

我还附上了各个表格的图片

黑客

hacker_id name
     5077 Rose
    21283 Angela
    62743 Frank
    88255 Patrick
    96196 Lisa

挑战

challenge_id hacker_id
       61654      5077
       58302     21283
       40587     88255
       29477      5077
        1220     21283
       69514     21283
       46561     62743
       58077     62743
       18483     88255
       76766     21283
       52382      5077
       74467     21283
       33625     96196
       26053     88255
       42665     62743
       12859     62743
       70094     21283
       34599     88255
       54680     88255
       61881      5077

所以,到目前为止,我已经做到了

SELECT c.hacker_id, h.name, COUNT(c.challenge_id) AS challenge_count
FROM Challenges c LEFT JOIN Hackers h on  c.hacker_id = h.hacker_id
GROUP by 1,c.hacker_id HAVING challenge_count >= 
MAX(challenge_count) ORDER BY challenge_count DESC ,c.hacker_id DESC;

但没有得到预期的输出。我的输出

我需要从输出中排除重复的结果,例如应排除具有相同挑战数量的黑客。

【问题讨论】:

  • 那么.. 这里应该排除谁?
  • 如果挑战次数小于最大值,应排除挑战次数相同的黑客。如果两个黑客的挑战次数相同,并且是最大值,则需要包括两个黑客
  • @sagi 至少他是一致的:-)
  • @TimBiegeleisen Lol,很好理解,我会为此投票赞成你:)

标签: mysql join


【解决方案1】:
SELECT t1.name,
       t1.hacker_id,
       COALESCE(t2.challengeCount, 0) AS challengeCount
FROM Hackers t1
LEFT JOIN
(
    SELECT hacker_id, COUNT(*) AS challengeCount
    FROM Challenges
    GROUP BY hacker_id
) t2
    ON t1.hacker_id = t2.hacker_id
WHERE COALESCE(t2.challengeCount, 0) IN
(
    SELECT t1.challengeCount
    FROM
    (
        SELECT t1.hacker_id,
               COALESCE(t2.challengeCount, 0) AS challengeCount
        FROM Hackers t1
        LEFT JOIN
        (
            SELECT hacker_id, COUNT(*) AS challengeCount
            FROM Challenges
            GROUP BY hacker_id
        ) t2
            ON t1.hacker_id = t2.hacker_id
    ) t1
    GROUP BY t1.challengeCount
    HAVING COUNT(*) = 1
) OR COALESCE(t2.challengeCount, 0) =
(
    SELECT MAX(t.challengeCount) FROM
    (
        SELECT COUNT(*) AS challengeCount
        FROM Challenges GROUP BY hacker_id
    ) t
)
ORDER BY COALESCE(t2.challengeCount, 0) DESC,
         t1.hacker_id

【讨论】:

  • 这里的t2是什么??餐桌挑战??
  • t2 只是一个表别名
  • 我尝试执行您的查询,但它只显示挑战次数最多的黑客
  • 查询的输出消除了重复项,但需要使用hacker_id和challengeCount以降序方式排序,我还需要hacker_id
  • 感谢您的努力..但您没有通过测试用例..结果未排序
【解决方案2】:

这里有几个标准:

  1. hacker_id、姓名和每位学生创建的挑战总数
  2. 按挑战总数降序排列您的结果。
  3. 如果多个学生创建了相同数量的挑战,则按hacker_id 对结果进行排序。
  4. 如果不止一名学生创建了相同数量的挑战,则将这些学生排除在结果之外。
  5. 除非计数等于创建的挑战的最大数量,

以下处理项目 1,2 和 3...

SELECT h.*
     , COUNT(c.challenge_id) challenge_count 
  FROM hackers h 
  JOIN challenges c 
    ON c.hacker_id = h.hacker_id 
 GROUP 
    BY h.hacker_id
 ORDER 
    BY challenge_count DESC, hacker_id;

我们可以将此查询连接到自身一次,以解析条件 4,然后再次解析项目 5,如下所示:

SELECT DISTINCT a.*
           FROM 
              ( SELECT h.*
                     , COUNT(c.challenge_id) challenge_count 
                  FROM hackers h 
                  JOIN challenges c 
                    ON c.hacker_id = h.hacker_id 
                 GROUP 
                    BY h.hacker_id
              ) a
           LEFT
           JOIN
              ( SELECT h.*
                     , COUNT(c.challenge_id) challenge_count 
                  FROM hackers h 
                  JOIN challenges c 
                    ON c.hacker_id = h.hacker_id 
                 GROUP 
                    BY h.hacker_id
              ) b
             ON b.hacker_id <> a.hacker_id AND b.challenge_count = a.challenge_count
           LEFT
           JOIN
              ( SELECT h.*
                     , COUNT(c.challenge_id) challenge_count 
                  FROM hackers h 
                  JOIN challenges c 
                    ON c.hacker_id = h.hacker_id 
                 GROUP 
                    BY h.hacker_id
              ) c
             ON c.challenge_count > a.challenge_count
          WHERE b.hacker_id IS NULL  
             OR c.hacker_id IS NULL
          ORDER 
             BY challenge_count DESC, hacker_id;

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2018-12-10
    • 1970-01-01
    • 2021-09-01
    • 2016-10-11
    相关资源
    最近更新 更多