- - PR -
複数テーブルからうまくデータが取得できない
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-07-21 17:17
はじめまして、けんといいます。
現在、PHP4+MySQL4.0で、あるサッカーチームの対戦成績を管理するシステムを作成します。 その中で「得点ランキング」の作成がうまくいかないので質問させていただきます。 使用しているテーブルは以下
最終的に取得したいテーブルは、以下のような感じです。
選手名・得点のみでしたら
の SQL により取得できたのですが、試合数が絡んでくると どのように SQL を記述すればよいのか分かりません。 (一つの SQL でやろうとするから無理があるのか、 そもそもテーブルの設計が悪いのかもしれませんが。。。) よろしくお願いします。 | ||||||||||||
|
投稿日時: 2006-07-21 19:57
DB2なら、
みたいな感じで出来ますが、MySQLでサポートしているかわかりません。 言い換えますと、SQL標準では TABLE キーワードは LATERAL としてサポートしているので、MySQLがSQL標準のこの機能に準拠しているか、が使えるかどうかの分かれ目と思います。 [ メッセージ編集済み 編集者: とんくま 編集日時 2006-07-21 19:58 ] | ||||||||||||
|
投稿日時: 2006-07-21 20:22
とんくま様、返信ありがとうございます。
掲載して頂いたコードを実行してみましたが #1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'TABLE (SELECT COUNT(S.goalMember) FROM Score とエラーになってしまいましたので、サポートされていないと思われます。 さてどうしたものでしょうか・・・。 | ||||||||||||
|
投稿日時: 2006-07-21 21:27
TABLE の代わりに LATERAL でも駄目ですか?
これもありと思いますが、パフォーマンスが悪いかもしれません。 (JOINした結果が、3テーブルそれぞれの行数の掛け算になる)
[ メッセージ編集済み 編集者: とんくま 編集日時 2006-07-21 21:29 ] | ||||||||||||
|
投稿日時: 2006-07-23 02:54
MySQL5で確認しているので、4でいけるかはわかりませんが・・・・
ScoreテーブルをgoalMemberでGROUP化し、COUNT(goalMember)すると 選手ごとの得点数が取れるんですよね。 ==================== SELECT goalMember, COUNT(goalMember) From Score Group By goalMember ; ==================== これに試合数をつけようとすると ==================== SELECT goalMember, COUNT(goalMember), COUNT(DISTINCT gameID) gameCount FROM Score GROUP BY goalMember ; ==================== ってかけると思います。 #テーブル定義上、1試合で複数選手がScoreテーブルに登場しそうなので、 #COUNT(DISTINCT 〜)で重複を省いた形で試合数のカウントを取らせて見ました。 後は名前を出すのに、 ==================== SELECT goalMember, ( SELECT name FROM Member Where id = Score.goalMember) name, COUNT(goalMember) score, COUNT(DISTINCT gameID) gameCount FROM Score GROUP BY goalMember ; ==================== とサブクエリでつければいいかと。 得点率はこれ自体をFROM句に指定し、 得点と試合数の列から計算できる・・・・のかな? #すみません、サッカーはわからないので。 イメージはこんな感じです。 ==================== SELECT goalMember,name,score,gameCount, score/gameCount rate FROM ( SELECT goalMember, ( SELECT name FROM Member Where id = Score.goalMember) name, COUNT(goalMember) score, COUNT(DISTINCT gameID) gameCount FROM Score GROUP BY goalMember ; ) t ORDER BY score ; ==================== こんな感じでどうでしょうか? _________________ 夏椰 @ わんくま同盟 夏椰の庵 Microsoft MVP for Windows Server System - SQL Server ( Jul 2006 - Jun 2008 ) | ||||||||||||
|
投稿日時: 2006-07-23 11:59
Scoreテーブルの GameID を COUNT した場合、
ある選手が、試合には出たが1点も取れなかったら、その選手の GameCount が実際より少なくなりませんか? | ||||||||||||
|
投稿日時: 2006-07-24 00:18
あっっと、そうですね。失礼しました。 そう考えるとGameEntryをJOINしないとまずいっすねぇ。 _________________ 夏椰 @ わんくま同盟 夏椰の庵 Microsoft MVP for Windows Server System - SQL Server ( Jul 2006 - Jun 2008 ) | ||||||||||||
|
投稿日時: 2006-07-24 11:14
返信ありがとうございます。
とんくま様> LATERAL でも駄目でした。 また提示して頂いた SQL についてですが、 実は GameEntry テーブルは最近になって追加したテーブルで、 現時点では 2006年度試合分のレコードしか作成できていないので、 提示して頂いた SQL を実行した結果、試合数が合いませんでした。 ですが、必要なレコードをすべて追加すればこれでいけそうです。 ちなみに、パフォーマンスについてですが、0.01秒ほどで取得できましたので それほど悪いというわけでもなさそうです。 取得してきたレコードが少なかった(数十件程度)のもあると思いますが、 そもそもこのアプリは、特定の1チームについてのみの扱いなので、 選手数は多くなっても 50 程度にしかならないので問題ないのかなと考えています。 夏椰様> 返信ありがとうございます。 実は、MySQL 4.0 だとサブクエリが使えないんです。 バージョンが 4.1 以上だと使えるみたいなのですが、環境は 4.0 が前提ですので・・・。 SQL まで提示して頂いたのに申し訳ないです。。。 あと、話はちょっと変わるのですが、今までテーブルを結合してデータを取得する際には、 全部外部結合で行ってきたのですが、外部結合でもかまわないのでしょうか? 絶対に外部結合じゃないといけないというわけではありませんが、気になったので。 (そもそも、内部結合と外部結合の使い分けがよく分かってなかったり。。。) |