MySQL 8 嵌套 select 有计数
MySQL 8 nested select with count
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() 或 count (*) 替换 count(1) 没有帮助。
此查询对于 MySQL8 应该是什么样的?
您在 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
谓词而不是 =
。
单词rank
是MySql8中的reserved word。
所以使用另一个别名,或者反引别名。
而在 MySql 8 中你可以使用 window functions
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;
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() 或 count (*) 替换 count(1) 没有帮助。
此查询对于 MySQL8 应该是什么样的?
您在 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
谓词而不是 =
。
单词rank
是MySql8中的reserved word。
所以使用另一个别名,或者反引别名。
而在 MySql 8 中你可以使用 window functions
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;