以下のテーブル内容があり

zyun | total_point | point_count
------+-------------+-------------
3 | 50000 | 3
2 | 60000 | 3
1 | 80000 | 1
zyunというフィールドで3となって値を
前のレコードのpoint_countを足して
zyunというフィールドの値を
5にして抽出したいのですがどうしたらいいかわかりますか??
ちなみにpoint_countが1以外の時です。

php4でソースを書いて欲しいのですが
可能でしょうか??
DBはPostgreSQLです。



出力結果が
1位 80000点
2位 60000点
5位 50000点
としたいです。どうしたらいいでしょうか??

回答の条件
  • 1人2回まで
  • 登録:2006/04/07 18:05:02
  • 終了:2006/04/10 10:33:18

回答(2件)

id:birdie-brain No.1

birdie-brain回答回数40ベストアンサー獲得回数42006/04/07 20:43:34

ポイント10pt

質問ではPHPで、ということでしたが、SQLでも求めている結果を出すことは可能です。

SELECT

  1 + ( SELECT COALESCE(SUM(point_count), 0) FROM table_name WHERE zyun < tbl.zyun ) as zyun,

  total_point,

  point_count

FROM

  table_name AS tbl

ORDER BY

  zyun

(自分の順位) = (自分より成績が上の件数) + 1

という考え方に基づいた方法です。

id:hopefully

ありがとうございます

2006/04/10 10:31:40
id:bonlife No.2

回答回数421ベストアンサー獲得回数752006/04/08 01:23:49

ポイント60pt

point_countはzyunが同じ人の人数というイメージで合っていますでしょうか。

例では80000点が1人、60000点が3人、50000点が3人いると考えました。

単純に点数の順位では80000点が1位、60000点が2位、50000点が3位となってしまうところを、それぞれの点数の人数を考慮し、80000点は1位、60000点は2位、50000点は5位としたいというご要望だと考えたのですが、合っていますでしょうか。

zyunが一意な値(重複がない値)の場合、以下のソースでお望みの出力結果になります。

<?php
$con = pg_connect("適切な接続情報を記入");
// zyunの昇順で検索
$rs = pg_query($con, "select * from total_point order by zyun");
// 結果行数を$maxrowsにセット
$maxrows = pg_num_rows($rs);
// 結果が0行でない場合は処理を実行
if ($maxrows!=0){
// HTML出力
print <<<EOF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PostgreSQLを使った順位表示のサンプル</title>
</head>
<body>
EOF;
// テーブルに検索結果をセット
	print '<table>'. "\n";
// 順位の値を格納するための変数$rankを作成
// 順位なので初期値は1
	$rank = 1;
	for ($i = 0; $i < $maxrows; $i++) {
		$arr = pg_fetch_array($rs,NULL,PGSQL_ASSOC);
		print "\t<tr>\n";
		print "\t\t<td>" . $rank . "位</td>\n";
		print "\t\t<td>" . $arr['total_point'] . "点</td>\n";
//		print "\t\t<td>" . $arr['point_count'] . "人</td>\n";
		print "\t</tr>\n";
// 順位にpoint_countの値を足し、次の順位を算出
		$rank += $arr['point_count'];
	}
// HTML出力
print <<<EOF
</table>
</body>
</html>
EOF;
}
pg_close($con);
?>

文字コードはUTF-8を前提にして書いておりますので、必要に応じて適宜HTML出力部分のmetaタグの内容を書き換えてください。

出力結果のHTMLのソースを見やすくするために\nや\tと書いている部分がありますが、削除しても動作には影響ありません。

一度確認してみてください。

id:hopefully

まさしくその通りです。

めでたく出来ました。

大変ありがとうございます。

2006/04/10 10:32:11

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません