2016-12-14 12 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

1つのレコードしか格納できませんでした。しかし、それだけで半分のレコードをカウントするために選択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は、1つまたは2つの数値引数をとります。これらの数値引数は、負の整数定数でなければなりません。

  • ?LIMITパラメータは?を使用して指定できます。プレースホルダマーカー。
  • ストアド・プログラム内で、LIMITパラメータは、整数値のルーチン・パラメータまたはローカル変数を使用して指定できます。言い換えれば

LIMITは、その引数は、列名、サブクエリ、または式にすることはできません。

2つのクエリでこれを行う必要があります。あなたが欲しいのカウントを取得する最初:LIMIT

SELECT FLOOR(COUNT(*)/2) AS player_count FROM selectedPlayers; 

あなたの元のクエリのための第二は、リテラル数値引数またはクエリパラメータを使用して、適用:

私はあなたが代わる <player_count>を書いた
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> 

整数値を補間するか、またはセッション変数またはクエリパラメータを使用して、最初のクエリの結果を返します。または、このクエリをストアドプロシージャに記述する場合は、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

私はphpMyAdminのではなく、SQL ServerのDECLARE文なし – Kari

+0

試みでMySQLを使用しています 「近く@linecountを宣言する」不正な構文を取得して取得することができ、多分MySQLはそれが – user3700389

+2

'DECLARE'のみ内部の最初のステートメントとして許可されている必要はありません。ストアドルーチンの 'BEGIN/END'ブロックです。また、MySQLは共通テーブル式の 'WITH'構文もまだサポートしていません。これはMySQL 8.0にあります。 –

関連する問題