запрос из SQL / 92 не работает в более поздних версиях - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть 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

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

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

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

EDIT:

Если вы хотите максимальное значение, вы можете использовать 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;
...