質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

4727閲覧

MySQLでのランキング付けについて

退会済みユーザー

退会済みユーザー

総合スコア0

mysqli

MySQLiはPHP5より導入されているデータベース用のドライバです。MySQL 4.1.3以降の新しい機能の利点をまとめています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2016/07/13 15:37

MySQLでのある値のランキングを取得するというものなのですが、
http://hatena.phalusamil.com/entry/2015/09/23/094536
こちらのサイトを参考にしてみましたが、
私のDBでは現在色んな値を一つのtableで保存しています。しかし、PRIMARY KEYはtable内で一つしか作成できないと思います。
そこで、他の値のランキングも取得したいのですが
方法としては、ランキング付したい値ごとにtableをその分作成する。
というものがあると思うのですが、貴方がする場合これは効率の良い方法だと思われますか?
更に効率の良い方法があれば、教えていただきたく思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

http://hatena.phalusamil.com/entry/2015/09/23/094536
の、ユーザ変数でランキングを求めるSQLですが

MySQLのマニュアルと
OracleACEのAketiJyuuzouさんとyoku0825さんと
日本オラクルの木村明治さんによると
MySQLのユーザ変数は評価順序が未定義です。
http://qiita.com/AketiJyuuzou/items/cced9b70cc714b382d98

なので、結果が正しいランキングになることが保証されません。

結果が保証されないといえば、
OrderBy句がないと出力順が保証されないのは有名ですね。

投稿2016/07/14 03:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/07/14 03:41

できました! ありがとうございました
guest

0

ランクに関しては考え方が2つあります

  • 常に連番

1,2,3,4,5・・・

  • 特定のカラムについてランク付けするが同値の場合は同順位とする
    1,2,2,4,5・・・

tblテーブルののxxxカラムに対してランク付けする場合上記はこうします

SQL

1 select (select @r:=@r+1 from (select @r:=0) as dummy) as rank,tbl.* from tbl order by xxx;

下記はこうします

SQL

1select (select count(*)+1 from tbl as t2 where t2.xxx<t1.xxx) as rank,t1.* from tbl as t1 order by xxx;

ロジックとしては、自分より上の順位の人数を数えて、それに1を足すと自分の順位

投稿2016/07/14 00:44

yambejp

総合スコア114812

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ランキングというのは順序を並べ替えた後に上から「1」「2」「3」という数字が欲しい、ということでしょうか?だとしたら以下のような方法で上から順に1から連番で割り当てることができます。

SQL

1/* 2対象のテーブルをTargetTableとする 3ランキングを求めたいカラムをorderColumnとする 4*/ 5SELECT 6 @n:=@n+1 AS Ranking, 7 TargetTable.* 8FROM 9 TargetTable, 10 (SELECT @n:=0) AS dummy 11ORDER BY 12 TargetTable.orderColumn;

dummyという名前で架空のテーブルを結合し、dummyの持つ@nという変数に1列ごとに+1していくことで、TargetTableとはまったく影響しあわずにRankingというカラムを作り出すことができます。

投稿2016/07/13 23:35

masaya_ohashi

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

プライマリーキーとデータを取得するときの並び順は関係ないです。

確かにデータベースの正規化という点では、テーブルを分ける方が望ましいと思います。

テーブル構造と欲しいデータが、わからないのですが、現在のテーブル構成でも カラムを利用して、ランキングする条件で、ソートが可能であれば、

select * from テーブル order by カラム名1, カラム名2

のような感じで、データを並び替えたり、集計したりすれば、取得できると思います。

速度面だと、条件に応じた、複合インデックスを作る必要があるかもしれませんが。

投稿2016/07/13 22:34

編集2016/07/13 22:46
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問