У меня есть такой sql-запрос:
select tt.product_name, tt.countt
from (select ofr.product_name as product_name, count(*) as countt
from offers ofr
group by ofr.product_name) as tt
where 12 = (select max(tt.countt) from tt);
моя проблема в последней строке: sql не распознает таблицу tt!
Насколько я знаю, в SQL/92 такое использование таблиц работает. Но я не знаю, какую альтернативу мне использовать в более поздних версиях.
Я использую эту версию MY-SQL:
mysql Ver 14.14 Distrib 5.7.25, для Linux (x86_64) с использованием оболочки EditLine
ОБНОВИТЬ: Я хочу, чтобы строка в tt, которая является "countt", была максимальной среди всех строк в tt. Число «12» было примером, потому что на основе данных в моей базе данных максимальное значение столбца «count» будет равно 12.
Удалите точку с запятой перед WHERE.
Какая СУБД дает сбой? Какая версия?
У вас есть стол тт? Псевдоним таблицы tt не может быть выбран в подзапросе - все в соответствии с ANSI SQL-92!
Я не понимаю, для чего предназначен max()
. Я был бы удивлен, если бы этот Когда-либо работал в MySQL.
Возможно, вы намерены:
select tt.product_name, tt.countt
from (select ofr.product_name as product_name, count(*) as countt
from offers ofr
group by ofr.product_name
) tt
where 12 = tt.countt;
Подзапрос не нужен для этой логики. Вместо этого вы можете использовать предложение HAVING
.
Обновлено:
Если вам нужно максимальное значение, вы можете использовать ORDER BY
и LIMIT
:
select ofr.product_name as product_name, count(*) as countt
from offers ofr
group by ofr.product_name
order by countt desc
limit 1;
@TheImpaler Я хочу, чтобы строка в tt, в которой она «countt», была максимальной среди всех строк в tt. Число «12» было примером, потому что на основе данных в моей базе данных максимальное значение столбца «count» будет равно 12.
@ k47 Позвольте мне запустить виртуальную машину и попробовать MySQL.
Единственное решение, которое сработало для меня в MySQL 5.x, требует повторения вашего запроса. В MySQL 8.x вы можете использовать CTE (Common Table Expressions), но это недоступно в 5.x.
Во всяком случае, вот запрос, который работает:
select x.*
from (
select product_name, count(*) as cnt
from offers
group by product_name
) x
join (
select max(cnt) as ct
from (
select product_name, count(*) as cnt
from offers
group by product_name
) y
) z on z.ct = x.cnt
Результат:
product_name cnt
------------ ---
Daguerrotype 3
Для справки, данные, которые я использовал:
create table offers (
product_name varchar(30)
);
insert into offers (product_name) values ('Daguerrotype');
insert into offers (product_name) values ('Transistor radio');
insert into offers (product_name) values ('Victrola');
insert into offers (product_name) values ('Daguerrotype');
insert into offers (product_name) values ('Victrola');
insert into offers (product_name) values ('Daguerrotype');
group by ofr.product_name) as tt;
точка с запятой после tt не нужна