MySQL 8 вложенный выбор с количеством - PullRequest
0 голосов
/ 24 января 2019
SELECT mapname, 
    (SELECT count(1)+1 FROM ck_bonus b WHERE a.mapname=b.mapname AND a.runtime > b.runtime AND a.zonegroup = b.zonegroup AND b.style = %i) AS rank, 
    (SELECT count(1) FROM ck_bonus b WHERE a.mapname = b.mapname AND a.zonegroup = b.zonegroup AND b.style = %i) as total 
    FROM ck_bonus a WHERE steamid = '%s' AND style = %i;

Этот бит кода прекрасно работал до обновления MySQL8, но теперь плюет с этой ошибкой

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
 'rank, (SELECT count(1) FROM ck_bonus b WHERE a.mapname = b.mapname AND a.zonegro' at line 1

Я перешел через Google и не смог найти правильный ответ.замена count (1) на count () или count (*) не помогла.

Как должен выглядеть этот запрос для MySQL8?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Слово rank является зарезервированным словом в MySql 8.

Поэтому используйте другое имя псевдонима или вставьте обратное имя псевдонима.

А в MySql 8 вы можете использовать оконные функции

SELECT 
 mapname, 
 DENSE_RANK() OVER (PARTITION BY mapname, zonegroup, steamid, style ORDER BY runtime DESC) AS `rank`,
 COUNT(*) OVER (PARTITION BY mapname, zonegroup, steamid, style) AS total
FROM ck_bonus 
WHERE steamid = '%s' AND style = %i;
0 голосов
/ 24 января 2019

Вы пропустили одинарные кавычки в outer & subquery:

SELECT mapname, 
       (SELECT count(1) FROM ck_bonus b WHERE a.mapname = b.mapname AND a.runtime > b.runtime AND a.zonegroup = b.zonegroup AND b.style = '%i') + 1 AS rnk, 
       (SELECT count(1) FROM ck_bonus b WHERE a.mapname = b.mapname AND a.zonegroup = b.zonegroup AND b.style = '%i') as total 
FROM ck_bonus a 
WHERE steamid = '%s' AND style = '%i';

Я подозреваю, что вам нужен LIKE предикат вместо =.

...