2016-09-20 6 views
1

チャリティーボーリングトーナメントのボウリングスコア(テーブル:ボウラー)のテーブルがあります。私は、ボーリングの可能な3試合にわたって男性と女性のためのトップの個人得点を引き出し、別のテーブル(テーブル:チーム)からチーム名と結びつけてから、上位のスコアを降順で並べるようにしています。テーブル内の複数の列から最大値を選択するとSQLエラーが発生する

私は男性のスコアから始めて、可能な3つのゲームで各人のトップスコアを選択し、すべてのレコードを降順で並べ替えるために働くべきSQLクエリを持っています。私はここでスタックオーバーフローに同様の質問に答えたのオフに、それをもと:https://stackoverflow.com/a/6871572

ここに私のクエリです:

$topmalebowler = "SELECT bowlers.bowler_name, teams.team_name, 
(SELECT MAX(v) FROM (VALUES (bowlers.game_1_score), 
(bowlers.game_2_score), (bowlers.game_3_score)) AS value(v)) 
as TopScore FROM bowlers INNER JOIN teams ON 
bowlers.team_id=teams.team_id WHERE bowlers.sex = 'M' 
ORDER BY 'TopScore' DESC"; 

私も、それを使用してエラーを得続けます。

「あなたはあなたのSQL構文でエラーが発生しているエラー。 近く「VALUES(bowlers.game_1_score)、(bowlers.game_2_score)を使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認し、 ラインで(bowlers.g」...」

私はどのように私はこのコードは一緒に部屋を結び付けることができますここで間違って何をやっている

注:??MySQLの5.5

+1

を私はあなたが間違っているこれらのいずれかを下にコピーされたと確信しているが、あなたのコードは 'ボウラーを参照しています'テーブルを参照していて、' bowlers_2016'テーブルを参照しています。 – tschwab

+0

あなたは正しいです...それを修正しました。ありがとう! – TMax

+1

もしあなたがMySQLを使用しているなら、あなたがリンクした質問の中で2番めにアップアップされた答えを見てください。使用している構文は、Microsoft SQL Serverでのみ動作します – Terminus

答えて

2

最初に投稿したコードは、MicrosoftのSQL実装であるT-SQLとSQL Server向けに書かれたものです。あなたは時々異なった構文を持っているMySQLを動かしています。 Terminusが指摘しているように、MySQLに使用されるものはGREATEST関数です。少なくとも一つのNULLゲームのスコアを持つ行をスキップ避けるため

、あなたはこのようなクエリ構築します:

SELECT bowlers.bowler_name, teams.team_name, 
GREATEST(
    IFNULL(bowlers.game_1_score, 0), 
    IFNULL(bowlers.game_2_score, 0), 
    IFNULL(bowlers.game_3_score, 0)) AS TopScore 
FROM bowlers 
INNER JOIN teams ON bowlers.team_id=teams.team_id 
WHERE bowlers.sex = 'M' 
ORDER BY 'TopScore' DESC 
+0

ありがとう、tschwab。しかしもう少し実験したところ、GREATESTはnull値の行を考慮していないようです。たとえば、スコアが高いボウラーが、game_3_scoreには「null」という値が設定されています。それらを説明し、最も大きな機能を使用する方法はありますか?それがヌル値を許すように思われたので、私が "MAX"関数を動作させようとしていた理由の1つでした。 – TMax

+0

できますか[この回答](http://stackoverflow.com/a/2684184/1455074)作業ですか? – tschwab

+1

私の謝罪、その答えは2つの列にしか働かない。私は自分の答えを更新しました。 – tschwab

関連する問題