mysql - 使用 AS 避免相同的查询 mySQL

标签 mysql sql

我正在尝试获取一半优秀玩家的 ID,但仅限于包含在 node_id=28 中的 ID

" SELECT * FROM 
        (SELECT npid.player_id  
        FROM node_to_player_ids    npid

            INNER JOIN  players_gameplay_info    pg
            ON  npid.player_id = pg.player_id

        WHERE  npid.node_id = 28
        ORDER BY  pg.score_collected ASC)  AS selectedPlayers
   LIMIT  (SELECT COUNT(*) FROM selectedPlayers) / 2"

大约有 1000 000 个条目需要计算,所以我想将其存储在一个变量中,但是,我们不能像 @myLocalVariable

这样的变量中存储多行

只能存储一条记录。但是,应该可以将选择解释为 AS selectedPlayers

这样我希望能够重新使用获得的大量player_ids并迭代它们,而不是执行相同的选择查询只是为了计算一半的记录

但是,我收到错误

“SQLSTATE[42000]:语法错误或访问冲突:第 10 行“(SELECT COUNT(*) FROM selectedPlayers)/2”附近 1064

最佳答案

https://dev.mysql.com/doc/refman/5.7/en/select.html说:

The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants, with these exceptions:

  • Within prepared statements, LIMIT parameters can be specified using ? placeholder markers.
  • Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables.

换句话说,LIMIT不允许其参数是列名、子查询或表达式。

您必须在两个查询中执行此操作。第一个得到你想要的计数:

SELECT FLOOR(COUNT(*)/2) AS player_count FROM selectedPlayers;

第二个用于您的原始查询,其中 LIMIT应用,使用文字数字参数或查询参数:

SELECT npid.player_id  
FROM node_to_player_ids AS npid
INNER JOIN  players_gameplay_info AS pg
  ON npid.player_id = pg.player_id
WHERE npid.node_id = 28
ORDER BY pg.score_collected ASC
LIMIT <player_count>

我写的地方<player_count>您可以通过插入整数值或使用 session 变量或查询参数将其替换为第一个查询的结果。或者,如果您在存储过程中编写此查询,则可以 DECLARE局部变量。

如果您使用 phpMyAdmin,请注意 session 变量在请求之间不会保留,因为每个请求都会启动一个新 session 。

关于mysql - 使用 AS 避免相同的查询 mySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59686153/

相关文章:

mysql - Rails 创建 mysql View 或虚拟表

java - 使用 Java 8 将日期作为 Date 对象插入数据库中?

mysql - 使用两个 CREATE TABLE 命令并输出一个 ALTER TABLE 的脚本?

mysql - 当 mysql 位于专用服务器时,用于 PHP 的 Memcache

SQL RAISE EXCEPTION 不起作用

sql - 左加入建议

sql - Real * Bigint 不返回正确的值

sql - 帮助我将 Oracle 术语转化为 SQL Server 术语

c# - 当字符串以方向不可知字符(例如括号)结尾时解析 rtl 语言的问题

php - 使用 GET 执行数据库操作的快速、简单且安全的方法