一尘不染

使用AS避免相同的查询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万个条目要计数,所以我想将其存储在一个变量中,但是,我们不能像这样存储多行 @myLocalVariable

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

这样,我希望我会重用获得的大量的player_id并对其进行迭代,而不是执行相同的选择查询只是计算记录的一半

但是,我遇到了一个错误

'SQLSTATE[42000]: Syntax error or access violation: 1064 near '(SELECT COUNT(*) FROM selectedPlayers) / 2' at line 10'


阅读 135

收藏
2021-03-17

共1个答案

一尘不染

https://dev.mysql.com/doc/refman/5.7/zh-
CN/select.html说:

LIMIT子句可用于约束SELECT语句返回的行数。LIMIT接受一个或两个数字参数,这两个参数都必须是非负整数常量,但以下情况除外:

  • 在准备好的语句中,可以使用?指定LIMIT参数。占位符标记。
  • 在存储的程序中,可以使用整数值的例程参数或局部变量来指定LIMIT参数。

换句话说,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>您可以通过插入整数值或使用会话变量或查询参数,将其替换为第一个查询的结果。或者,如果您在存储过程中编写此查询,则可以DECLARE使用局部变量。

如果您使用的是phpMyAdmin,请注意会话变量在两次请求之间将无法生存,因为每个请求都会启动一个新的会话。

2021-03-17