Запрос из SQL/92 не работает в более поздних версиях

У меня есть такой 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.

group by ofr.product_name) as tt; точка с запятой после tt не нужна
Lukasz Szozda 08.04.2019 21:25

Удалите точку с запятой перед WHERE.

jarlh 08.04.2019 21:25

Какая СУБД дает сбой? Какая версия?

The Impaler 08.04.2019 21:32

У вас есть стол тт? Псевдоним таблицы tt не может быть выбран в подзапросе - все в соответствии с ANSI SQL-92!

jarlh 08.04.2019 21:35
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
4
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я не понимаю, для чего предназначен 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.

Kamran Hosseini 08.04.2019 21:47

@ k47 Позвольте мне запустить виртуальную машину и попробовать MySQL.

The Impaler 08.04.2019 21:48

Единственное решение, которое сработало для меня в 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');

Другие вопросы по теме