我正在尝试获取一半的好玩家的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
@myLocalVariable
只能存储一条记录。但是,应该可以解释选择AS selectedPlayers
AS selectedPlayers
这样,我希望我会重用获得的大量的player_id并对其进行迭代,而不是执行相同的选择查询只是计算记录的一半
但是,我遇到了一个错误
'SQLSTATE[42000]: Syntax error or access violation: 1064 near '(SELECT COUNT(*) FROM selectedPlayers) / 2' at line 10'
https://dev.mysql.com/doc/refman/5.7/zh- CN/select.html说:
LIMIT子句可用于约束SELECT语句返回的行数。LIMIT接受一个或两个数字参数,这两个参数都必须是非负整数常量,但以下情况除外: 在准备好的语句中,可以使用?指定LIMIT参数。占位符标记。 在存储的程序中,可以使用整数值的例程参数或局部变量来指定LIMIT参数。
LIMIT子句可用于约束SELECT语句返回的行数。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使用局部变量。
<player_count>
DECLARE
如果您使用的是phpMyAdmin,请注意会话变量在两次请求之间将无法生存,因为每个请求都会启动一个新的会话。