質問: テーブルB.ID AND 条件 WHERE 最終条件 ``` ### 試したこと 「FROM NO1」や「FROM NO2」は相関クエリのためかうまくいきませんでした。 一時テーブルにJOIN後のテーブルを格納する方法も試してみましたが、処理速度が遅くダメでした。 ### 追記 No1 >SQL文少し書き間違ってますね(メインのテーブルB⇒テーブルA) 仰る通りです。書き写しにミスがありましたので、修正しました。 またテーブルのサンプルを連携します。 ``` テーブルA ID ユーザーID 種別ID スコア PK UK UK idx テーブルB ID 種類ID 外部連携用ID PK UK UK ``` 情報は絞っていますがおおよそ上記のような感じで、UKは複合UKです。 JOINの条件としてテーブルBのUKを使い、最終条件で特定のユーザーIDのランキングを取得する想定です。 よろしくお願い致します。 ### 追記No2 >丸投げの割に提示する情報が少ないですね。追記されたサンプルではどういったデータ群からどういった結果を導きたいのか類推できません。 失礼しました。まだまだSQLは勉強不足で、どういう情報が必要なのかわかっていないのです。。もう少し情報を追記してみます。 テーブルA:ユーザー毎のスコアを管理 テーブルB:ゲームの種別マスタ(じゃんけん、クイズ、など) じゃんけんやクイズに関するスコアがテーブルAで管理されており、ランキングを取得する際は ・ユーザーID ・ゲーム種別 を指定することで、そのゲーム種別のスコアからランキングを取得したく思っております。
回答: そもそも select (なんたらかんたら) as rank from ・・・ では特定のidが指定されていないのでrankのつけようがありません ``` select id,(select count(*)+1 from tbl as t2 where t1.id=t2.id and t1.hoge>t2.hoge) from tbl as t1 ``` のように集約するidの指定と、関連付けと、比較条件が必要です また命題のテーブルAとテーブルBの紐付けについても本当に必要かどうかわかりませんし もし必要だとするなら、一度viewに落とし込んで、上記のようなランク処理をしてみると わかりやすくなります。 繰り返しになりますが、この手の質問は概念的なことを書かれても意味がわかりませんので 具体的なサンプルをつけて、「このサンプルからこういった結果を抽出したい」という 書き方をしないといつまでたっても結論はでないと思いますよ 追記 === tbl_aのsampleです。 ``` create table tbl_a(id int unique key,val int); insert into tbl_a values(1,100),(2,200),(3,300),(4,50); select (select count(*)+1 from tbl_a as t2 where t2.val>t1.val) as rank from tbl_a as t1 where id=1; /* id=1は結果:3位 */ ``` これにtbl_bがどうからんでくるのかいまいちわかりません 追記2 ==== tbl_aのcate_idがユニークではないので、1つだけランク抜き出すことは無理 ランクの羅列がほしいのでしょうか? ``` create table tbl_a(id int unique key,val int,cate_id int); insert into tbl_a values(1,100,1),(2,200,1),(3,300,2),(4,50,2); create table tbl_b(id int unique key,name varchar(10), type varchar(10)); insert into tbl_b values(1,"janken","win_rate"),(2,"quiz", "win_count"); ``` これに対して、name = 'janken' and type = 'win_rate'を元にランク計算 ``` select (select count(*)+1 from tbl_a as t2 where t2.val>t1.val) as rank from tbl_a as t1 where cate_id in (select id from tbl_b where name = 'janken' and type = 'win_rate') ``` ※select id,(・・・) as rank として、id毎のランクをとってもいい