PhP4.2 mysql4.0 に関して


mysqlについて質問です。
昇降順に関する質問です。

登録してあるmysql情報を下記とします。
カラムが名前、点数1、点数2とします。

並び替えをして、順位を現したいです。

(test)テーブル
----------------
(名前)(点数1)
a     5    
b     2    
c     4    
d     3    
e     1    
----------------
これを(点数1)で降順にします。
e b d c a
"SELECT * FROM test ORDER BY 点数1 DESC"

このような順番にします。
これを例えば、aなら「1」dなら「3」という風に
並べ替えた後の順番の数字を出すにはどうすればいいですか?

詳しい方お願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/10/10 22:19:29
  • 終了:2007/10/18 02:21:07

回答(2件)

id:chuken_kenkou No.1

chuken_kenkou回答回数722ベストアンサー獲得回数542007/10/11 04:00:14

ポイント35pt

前の質問を閉めて、内容を訂正した上で再質問されたのですね。

ポイント、ありがとうございました。

前の回答で示したユーザ変数を使う方法とは別のSQL例を、以下に示します。


<例1>点数1に重複がない場合

-- 点数1に重複なし
select x.名前,x.点数1,count(*) as rownum
 from test as x,test as y
 where x.点数1<=y.点数1
 group by x.名前,x.点数1
 order by x.点数1 desc

<例2>点数1が重複するケースがある場合→同点の場合は、名前の昇順で番号付け

-- 点数1に重複あり。同点のものは名前順
select x.名前,x.点数1,count(*) as rownum
 from test as x,test as y
 where x.点数1<y.点数1
    or x.点数1=y.点数1 and x.名前>y.名前
    or x.点数1=y.点数1 and x.名前=y.名前
 group by x.名前,x.点数1
 order by x.点数1 desc,x.名前

http://q.hatena.ne.jp/ダミー

id:rrr3

ありがとうございます。

x.名前

as rownum

group by

order by

○などを解りやすく解説していただけますか?

○また、最終的にPHPに連動させる場合はどのうようにすれば宜しいでしょうか?

お忙しいところお手数をお掛けいたしますがなにとぞ宜しくお願い申し上げます。

○また、他のやり方がわかる方もお願いします。

上記回答を踏まえて、下記でやってみました。

結果うまくいきませんでした。理由がわかえるかたお願いします。

名前を$namae

数字1を$suji1

としました

$query="select x.".$namae.",x.".$suji1

.",count(*) as rownum

from test as x,test as y

where x.点数1<=y.点数1

group by x.".$namae.",x.".$suji1

."

order by x.".$suji1." desc";

$result=mysql_query($query) or die("失敗");

2007/10/11 13:43:40
id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542007/10/11 16:34:54

ポイント35pt

MySQLでは、通番を付ける機能(Oracle等の分析関数など)が未実装です。そのため、利用者側で通番を作成する必要があります。

もっとも軽い方法は、最初に提示したユーザ変数を使う方法です。

SQLだけで通番を付けるには、同じ表同士をジョイン(自己結合)し、ユニークな値を持つキーの大小関係で、大きい値(または小さい値)が何件あるかを求めます。これが、結果として1個、2個、3個と増えていくので、これを利用します。

x.名前

as rownum

group by

order by

などを解りやすく解説していただけますか?

同じ表で自己結合を行うため、どちらの表も「test」という名前ですから、どちらの表かを区別するため、「as 別名」(asは省略可能)で名前を付けます。

今回の場合、test表に、xとyという別名を付け、どちらを参照するかを区別しています。

「x.名前」は、xという別名を付けた方のtest表の「名前」列という意味になります。

「as rownum」もやはり別名であり、「count(*)」に対して、列の別名を付けています。

関数などを使った場合、別名を付けないと、RDBMSにより長い名前が付けられます。

PHPで検索結果を参照する場合、RDBMSにより付けられた名称では参照できない(?)はずで、別名を付けて、その名称で連想配列から参照します。

「group by」、「order by」は、SQLの基本的な機能です。

ここで説明すると長くなるので、SQLの基本的な解説があるサイト等を参照してください。

今回、使っている理由を簡単に説明すると、行を一意に識別できるようにする&COUNT(*)で大小関係の件数を求めてるために、「group by」を使っています。

「order by」は、検索結果の取り出し順序を保証するために指定しています。

殆どのRDBMSでは、「ORDER BY」指定がない場合、結果の並びは保証されません。

最終的にPHPに連動させる場合はどのうようにすれば宜しいでしょうか?

結果うまくいきませんでした。理由がわかえるかたお願いします。

名前を$namae

数字1を$suji1

としました

$query="select x.".$namae.",x.".$suji1.",count(*) as rownum

from test as x,test as y

where x.点数1<=y.点数1

group by x.".$namae.",x.".$suji1."

order by x.".$suji1." desc";

列名と結果を受け取る変数名を、区別できていませんね。

操作例の記述があるサイトを、紹介しておきます。

PHP + MySQL 編2 - RDBMS 接続、ログイン、mysql_connect、mysql_select_db - SAK Streets

具体的には、上記サイトの説明の下記の部分です。

// MySQL 問い合わせ
  $sql = "select * from test order by key1";
  if (!($rs = mysql_query($sql))) {
    die;
  }

// MySQL レコード参照
  while ($item = mysql_fetch_array($rs)) {
    print "${item['key1']} ";
    print "${item['data1']} ";
    print "${item['data2']} ";
    print "${item['data3']}
";

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

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

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

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

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