0

特別なスコアを計算しようとしています。'total'と'correct'(またはorder)を取得するには異なるクエリが必要であり、totalは2つの場所で使用する必要があります。これにより、エイリアスの使用に問題が発生しました。この場合、サブクエリを繰り返すと、パフォーマンスと読みやすさが高額になります。私はそれを機能させるために2つの異なる方法を試しました:

SELECT rankings.id as link, (
  SELECT COUNT(*) as total FROM rankings
  INNER JOIN ranking_data ON ranking_id = rankings.id AND `type` = 'pre_reference'
  WHERE case_id = 15 AND rankings.id = link
) as total,
ROUND(((total - `order`) / total) * 100, 2) AS score FROM rankings
INNER JOIN ranking_data ON ranking_id = rankings.id AND opinion_id = 124 AND `type` = 'pre_reference'
WHERE case_id = 15 AND user_id != 3;

ここでは、サブクエリによって返される「合計」値のエイリアスを作成し、それをスコアリングの計算に使用しようとしました。リンク参照はサブクエリ内で機能しましたが、6行目で参照全体が失敗しました。

SELECT ROUND(((total - `order`) / total) * 100, 2) AS score FROM rankings
INNER JOIN ranking_data ON ranking_id = rankings.id AND opinion_id = 124 AND `type` = 'pre_reference'
INNER JOIN (
  SELECT COUNT(*) as total FROM rankings
  INNER JOIN ranking_data ON ranking_id = rankings.id AND `type` = 'pre_reference'
  WHERE case_id = 15
) AS total_table ON total_table.id = rankings.id
WHERE case_id = 15 AND user_id != 3;

ここでは、派生テーブルを左結合することにより、スコアリングのために列リスト領域で合計を利用できるようにしようとしました。MySQLは、7行目でtotal_table.idが見つからないと言っていました。左結合を試行すると、一般的な構文エラーがスローされます。

解決策を教えてください。他の試みがうまくいかなかった理由を明らかにしてください。

4

1 に答える 1

1

2番目のクエリでは、インラインビューidで選択された列のセットに明示的に含まれていません。total_tableおそらく、でグループ化する必要もありますid。クエリを次のように変更してみてください。

SELECT ROUND(((total - `order`) / total) * 100, 2) AS score 
FROM rankings
INNER JOIN ranking_data 
ON ranking_id = rankings.id AND opinion_id = 124 AND `type` = 'pre_reference'
INNER JOIN 
( SELECT rankings.id, COUNT(*) as total FROM rankings
  INNER JOIN ranking_data 
  ON ranking_id = rankings.id AND `type` = 'pre_reference'
  WHERE case_id = 15
  GROUP BY rankings.id
) AS total_table 
ON total_table.id = rankings.id
WHERE case_id = 15 AND user_id != 3;
于 2012-09-05T07:26:17.230 に答える