В чем разница между этими двумя SQL-запросами?

#mysql

Вопрос:

Этот запрос дает неправильный ответ

Первый запрос:

 SELECT h.hacker_id,
       h.name,
       COUNT(c.challenge_id)
FROM hackers h
     INNER JOIN challenges c ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id,
         h.name
HAVING COUNT(c.challenge_id) = (SELECT MAX(temp.cnt) AS maxi
                                FROM (SELECT hacker_id,
                                             COUNT(challenge_id) AS cnt
                                      FROM challenges
                                      GROUP BY hacker_id) temp )
    OR COUNT(c.challenge_id) IN ((SELECT temp.cnt
                                  FROM (SELECT hacker_id,
                                               COUNT(challenge_id) AS cnt
                                        FROM challenges
                                        GROUP BY hacker_id) temp
                                  GROUP BY temp.cnt
                                  HAVING COUNT(temp.cnt) = 1))
ORDER BY COUNT(c.challenge_id) DESC,
         h.hacker_id;
 

Этот запрос дает правильный ответ

 SELECT h.hacker_id,
       h.name,
       COUNT(c.challenge_id) AS c_count
FROM hackers h
     INNER JOIN challenges c ON h.hacker_id = c.hacker_id
GROUP BY h.hacker_id,
         h.name
HAVING c_count = (SELECT MAX(temp.cnt) AS maxi
                  FROM (SELECT hacker_id,
                               COUNT(challenge_id) AS cnt
                        FROM challenges
                        GROUP BY hacker_id) temp )
    OR c_count IN ((SELECT temp.cnt
                    FROM (SELECT hacker_id,
                                 COUNT(challenge_id) AS cnt
                          FROM challenges
                          GROUP BY hacker_id) temp
                    GROUP BY temp.cnt
                    HAVING COUNT(temp.cnt) = 1))
ORDER BY COUNT(c.challenge_id) DESC,
         h.hacker_id;
 

используя псевдоним, я получаю правильный ответ.
На самом деле единственный вопрос заключается в том, когда я использую count(c.challenge_id) два раза в предложении having, я получаю неправильный ответ, а когда я использую псевдоним столбца c_count, я получаю правильный ответ.

Комментарии:

1. Пожалуйста, отметьте только одну СУБД, а не 3!

2. Пробелы и разрывы строк обязательны (это волшебные вещи); они облегчают чтение вашего очень сложного кода. Я предлагаю вам привыкнуть использовать их, так как ваши запросы очень трудно понять. Что это за случайные * символы в вашем SQL? Они могли бы привести к синтаксическим ошибкам.

3. Лишняя скобка в 1-м запросе.

4. Нет, я добавил еще несколько деталей моего конкретного сомнения.