【问题标题】:MySQL 8 nested select with countMySQL 8 带计数的嵌套选择
【发布时间】:2019-06-17 23:39:03
【问题描述】:
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

我浏览了谷歌,但找不到正确的答案。 用 count() 或 count (*) 替换 count(1) 没有帮助。

这个查询对于 MySQL8 应该是什么样的?

【问题讨论】:

  • Rank 在 8.0.2 中成为保留字 尝试不同的别名,您可能需要重写此查询以利用 8 中的窗口函数

标签: mysql sql database mysql-8.0


【解决方案1】:

rank 这个词在 MySql 8 中是一个 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;

【讨论】:

  • @olokos。谢谢代表。顺便说一句,如果您要使用窗口函数来简化它。请注意,我使用了 DENSE_RANK,但根据结果应该是什么,它可能需要 ROW_NUMBER。所以你必须测试你真正需要的窗口功能。如果分区是正确的。
  • 为了简单起见,我决定保持简单,只使用反引号:p
  • @olokos 可能是最好的。 :-) 无论如何它可能会给出不同的数字,因为原始 SQL 中的那些嵌套查询在计数中不考虑相同的“steamid”。但是窗口函数是在 WHERE 和 HAVING 之后处理的,因此它们可能会返回更少,因为 WHERE 有一个关于“steamid”的标准。
  • 它可能给出不同的数字,在哪种情况下?使用反引号应该没问题吧?
  • 我提到了使用窗口函数与使用嵌套查询的区别。
【解决方案2】:

你错过了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 谓词而不是=

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2018-10-03
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 2013-07-17
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多