2016-12-14 40 views
1

我想获得的优秀球员一半的ID,但是只有那些包含在NODE_ID = 28使用,以避免同样的查询MySQL的

" 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'

+1

如果你想存储多个ID,然后把它们放到一个临时表中,而不是一个变量。 –

+0

不想,我想避免任何写入,因为我认为这些会让我纠结于使用锁定并放慢速度(有100k个脚本并发运行的实例),我只需要知道行数,所以我可以得到一半 – Kari

回答

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,请注意会话变量在请求之间无法存活,因为每个请求都会启动一个新会话。

+0

如此不幸,有没有办法立即得到选择的计数 – Kari

+0

不与'LIMIT'。为什么这是一个问题?在一个事务中执行两个查询,并且它会一致(除了事务不能跨越多个phpMyAdmin请求)。 –

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 

+0

得到不正确的语法'near declare @linecount' 我正在使用mySQL与phpMyadmin,而不是SQL Server – Kari

+0

尝试没有declare语句,也许MySql不需要它 – user3700389

+2

DECLARE'只允许作为内部的第一个语句存储例程中的BEGIN/END块。此外,MySQL还不支持常用表表达式的'WITH'语法。这是在MySQL 8.0中。 –