[pgsql-jp: 37426] Re: 一部のデータを SELECT した際に全体の順位取得

whi te white_wwjd @ yahoo.co.jp
2006年 8月 18日 (金) 14:35:54 JST


こんにちは。
ご返信ありがとうございます。

私がPHP初級レベルゆえ、示して下さったPHPをちゃんと理解出
来ていないので、間違えだったら申し訳ないのですが、
この方法だと、同点の場合ランキングが同一にはならなくない
でしょうか。
また、次ページ等推移した際に例えば6〜10位も表示はされる
のでしょうか。

PHPで処理する事も考えたのですが、同一ランクや
全体の順位を取得するのが難しいのかな思っています。
あと、1ページに5個のデータしか表示しないので、全データを
取得してPHPで処理するよりも、OFFSETを使用して、必要なだ
けのデータを取得する方が軽いのかなって思って・・・。
ただの、勘ですけど。

一応OFFSETの値をSmartyに渡して、Smarty上で処理をして順位
は出たのですが、ちょっと汚いんですよね。
あと同点の際が処理出来ないんですよね
(出来なくは無いと思いますが、それこそ汚くなりそう(^_^;)

{foreach 〜}

{if $rank}
  {assign var="rank" value=$rank+1}
{else}
  {assign var="rank" value=$offset+1}
{/if}

第{$rank}位

{/foreach}





> こんばんは田中です
> 
> 私はPHP上で配列に追加しちゃいます
> 
> $list = array();
> while( $row = $res->fetchRow( DB_FETCHMODE_ASSOC ) )
> {
> 	$row['start_times1'] = time_str( $row['start_time1'] );
> 	$row['start_times2'] = time_str( $row['start_time2'] );
> 	$row['start_times3'] = time_str( $row['start_time3'] );
> 	$row['end_times1'] = time_str( $row['end_time1'] );
> 	$row['end_times2'] = time_str( $row['end_time2'] );
> 	$row['end_times3'] = time_str( $row['end_time3'] );
> 	$row['recesss'] = time_str( $row['recess'] );
> 	$row['workings'] = time_str( $row['working'] );
> 	$list[] = $row;
> }
> $smarty->assign( 'list', $list );
> 
> SQLでやるよりは単純で早いはず。。。
> 
> 田中
> 
> 06/08/17 に whi te<white_wwjd @ yahoo.co.jp> さんは書き
ました:
> > ご返信ありがとうございます。
> >
> > > 順位 =(自分より大きい points の人の数+1)と考
える
> > と、
> >
> > なるほど。
> > 確かに順位ってそういう事ですね。
> > 順位の意味(!?)を考えてみた事なかったですが、
> > そういう風に考え直すと、SQL文が作成出来ますね。
> > 勉強になりました。
> >
> > ただ、実際のデータってランキングテーブルに
> > 同一人物のデータが複数存在します。
> > ですので、例示して頂いたSQLを基に以下の様なSQL文を作
成し
> > てみたのですが、エラーが出てしまいます。
> >
> > COUNT/SUMしたデータを条件文に含む事は出来ないのでし
ょう
> > か。
> > ON句のSUMを試しに抜かしてみると、結果は違いますが、
> > SQLはとおります。
> >
> > SELECT r1.name,r1.points,SUM(r2.points)+1 as rank
> > FROM ランキング r1 LEFT JOIN ランキング r2 ON
> > SUM(r1.points) < SUM(r2.points)
> > GROUP BY r1.name,r1.points,r2.points
> > ORDER BY rank DESC
> >
> > ERROR:  aggregates not allowed in JOIN conditions
> >
> >
> >
> >
> >
> > > 賀内と申します。
> > >
> > > > TABLE名:ランキング
> > > >
> > > > name|points
> > > > -----------
> > > > aa  |60
> > > > bb  |80
> > > > cc  |70
> > > > dd  |40
> > > > ee  |20
> > > >
> > > >
> > > > SELECT * FROM ランキング OFFSET 2 LIMIT 2 ORDER BY
> > points
> > > > DESC;
> > > >
> > > > name|points
> > > > aa  |60
> > > > dd  |40
> > > >
> > > > が取得されると思いますが、「aa」が全体の何位かを
取得
> > する
> > > > 事は出来ないでしょうか。
> > > > 以下の様に取得するのが理想です。
> > > >
> > > > name|points|rank
> > > > aa  |60    |3
> > > > dd  |40    |4
> > >
> > > 順位 =(自分より大きい points の人の数+1)と考
える
> > と、
> > >
> > >  SELECT r1.name,r1.points,count(r2.*)+1 as rank
> > >  FROM ランキング r1 LEFT JOIN ランキング r2 ON
r1.points
> > < r2.points
> > >  GROUP BY r1.name,r1.points
> > >  ORDER BY rank
> > >
> > > と書けますよ。
> > > これだと OFFSET / LIMIT も使えるし、同じ points の
人が
> > いても大丈夫です。
> > >
> >



pgsql-jp メーリングリストの案内