Потому что в вашем контексте total - это просто псевдоним совокупного результата, а не значение. В общем, вы должны повторить часть COUNT(C.challenge_id)
, но это вам здесь не поможет, поскольку COUNT(COUNT(C.challenge_id)) = 1
явно неверно.
Есть решения для этого, такие как помещение результата набора данных агрегации во временную таблицу / переменную таблицы или использование CTE, поэтому подзапрос работает.
Отказ от ответственности: не проверяйте ваш запрос на корректность, но лучше звучит IN и использование CTE может быть лучшим подходом.
Ниже приведен пример решения с использованием MS SQL, извините, не запускайте MySql прямо сейчас, но не используете CTE =)
create table dbo.HACKER
(
hacker_id int,
name varchar(100)
)
GO
create table dbo.CHALLENGE
(
challenge_id int,
hacker_id int
)
GO
insert into dbo.HACKER
(hacker_id,name)
values
(5077,'Rose')
,(21283,'Angela')
,(62743,'Frank')
,(88255,'Patrick')
,(96196,'Lisa')
insert into dbo.CHALLENGE
(challenge_id, hacker_id)
values
(61654,5077)
,(58302,21283)
GO
--drop table #Temp
--drop table #totalsToExclude
select hk.hacker_id, hk.name, x.total
into #Temp
from dbo.HACKER hk
join (select ch.hacker_id, count(*) as total from dbo.CHALLENGE ch group by ch.hacker_id) as x
on x.hacker_id = hk.hacker_id
select * from #Temp
declare @maxTotal as int =(select max(total) from #temp)
select @maxTotal
select t.total, count(*) as [Count_total]
into #totalsToExclude
from #temp t
group by t.total
having(count(*) >1)
delete tx from #totalsToExclude tx where tx.total = @maxTotal
select * from #totalsToExclude
select * from #Temp t
where t.total not in (select t.total from #totalsToExclude)
order by t.total desc, t.hacker_id