使用AS来避免相同的查询mySQL

时间:2016-12-14 18:34:27

标签: 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]: Syntax error or access violation: 1064 near '(SELECT COUNT(*) FROM selectedPlayers) / 2' at line 10'

2 个答案:

答案 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