#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. Нет, я добавил еще несколько деталей моего конкретного сомнения.