我正在尝试获取一半优秀玩家的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]: Syntax error or access violation: 1064 near '(SELECT COUNT(*) FROM selectedPlayers) / 2' at line 10'
答案 0 :(得分:2)
https://dev.mysql.com/doc/refman/5.7/en/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,请注意会话变量在请求之间不存在,因为每个请求都会启动一个新会话。
答案 1 :(得分:0)
declare @linecount int
with query as
(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)
select @linecount = count(*)/2 from query
set rowcount @linecount
select * from query