ちょっと変わったマニアな作品が集結

idの順位を取得する方法はありますか?
voteが一番多い順にソートして指定したidの順位を取得したいです
もしくは、指定したidが3番以内に入っているかどうか調べたいです

テーブル
id vote
1 5
2 6
3 3
4 1
5 12

ソートした後のテーブルのイメージ id3の順位を指定した場合、4番目なので4を取得したいです
id vote
5 12
2 6
1 5
3 3
4 1

よろしくお願いします

このQ&Aに関連する最新のQ&A

A 回答 (2件)

順位を取得するには自己結合して『自分より順位が上の行数+1』を求めればよいです。



例) ----------------------------------

SELECT *,
(SELECT COUNT(*) FROM t_vote b WHERE a.vote < b.vote) + 1 AS rank
FROM t_vote a
ORDER BY vote DESC

-------------------------------------

ちなみに、MySQLにも分析関数が導入されればもっと簡単に求められるようになると思われます。

参考URL:http://codezine.jp/article/detail/460?p=2

この回答への補足

追記
なんとかなりました!ありがとうございました(_ _)

補足日時:2013/06/16 15:59
    • good
    • 0
この回答へのお礼

お答え頂きありがとうございます

phpmyadminで実行したら順位順にソートはできました

指定したidの順位を取得する方法はありますか?

実際にid15の順位を取得しようとするとエラーが出てだめでしたorz

$rec = mysql_query('SELECT *,
(SELECT COUNT(*) FROM vote b WHERE a.vote < b.vote) + 1 AS rank
FROM WHERE id=15 vote a
ORDER BY vote DESC
);

$flg = mysql_fetch_assoc($rec);
print $flg['id'];

お礼日時:2013/06/16 14:41

> 実際にid15の順位を取得しようとするとエラーが出てだめでしたorz


> FROM WHERE id=15 vote a

FROM句とWHERE句が混ざってますよ。
↓では?

FROM vote a WHERE id=15
    • good
    • 0
この回答へのお礼

すいません!混ざってしまいました
ご指摘ありがとうございます(_ _)
なんとかうまくいきました

お礼日時:2013/06/16 15:58

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QmySQLでグループ別の順位を入力

東京都の学校別のランクを作っています。

現在、name school pointまでは記載されています。
この後、SQL構文で、rank欄に学校内順位を入れ、city欄にtokyoを入れたいと考えています。

完成形は下記のようなものです。
(同点2位が2人いたら、いずれも2とし、その次の人は4となる)

table
name__school__city___point___rank
kameda__1高__tokyo___345____ 1
suzuki__2高__tokyo___341____ 1
kaneko__3高__tokyo___332____ 1
yosida__2高__tokyo___321____ 2
tanita__1高__tokyo___310____ 2
suyama__1高__tokyo___310____ 2
kisida__2高__tokyo___301____ 3
komine__1高__tokyo___299____ 4
tomita__2高__tokyo___289____ 4
sugita__1高__tokyo___275____ 5


下記のreplace文を考えたのですが、学校別の順位ではなく全体順位の入力となってしまいます。

REPLACE INTO table(rank,city)
SELECT (
SELECT COUNT(t2.poit)
FROM table t2
WHERE t2.poitn > t1.point
AND t2.school = t1.school
GROUP BY t2.school
) + 1 AS rank,tokyo
FROM table t1;

学校別の順位を入力するためにはどのように改良すればいいでしょうか?

SQLはmySQL5.5 CentOS6.3です。
よろしくお願いいたします。

東京都の学校別のランクを作っています。

現在、name school pointまでは記載されています。
この後、SQL構文で、rank欄に学校内順位を入れ、city欄にtokyoを入れたいと考えています。

完成形は下記のようなものです。
(同点2位が2人いたら、いずれも2とし、その次の人は4となる)

table
name__school__city___point___rank
kameda__1高__tokyo___345____ 1
suzuki__2高__tokyo___341____ 1
kaneko__3高__tokyo___332____ 1
yosida__2高__tokyo___321____ 2
tanita__1高__tokyo___310____ 2
suyama__1高__tokyo...続きを読む

Aベストアンサー

元表のプライマリキーはどうなっているのでしょうか?
nameをidにするとユニークを確保するのがかなり大変ですが大丈夫ですか?

//準備
create table seiseki(name varchar(20) primary key,school varchar(10),city varchar(10) null,point int not null,rank int null);
insert into seiseki(name,school,point) values ('kameda','1高',345),('suzuki','2高',341),('kaneko','3高',332),('yosida','2高',321),('tanita','1高',310),('suyama','1高',310),('kisida','2高',301),('komine','1高',299),('tomita','2高',289),('sugita','1高',275);
select * from seiseki;

//nameごとのschool単位での順位
select name,(select count(*) +1 from seiseki as t2 where 1 and t2.point > t1.point and t2.school= t1.school ) as rank
from seiseki as t1;

//上を応用して、rankとcityを更新
update seiseki as t0
inner join (select name,(select count(*) +1 from seiseki as t2 where 1 and t2.point > t1.point and t2.school= t1.school ) as rank
from seiseki AS t1 ) as t3 on t0.name=t3.name
set t0.rank=t3.rank,t0.city='tokyo';

元表のプライマリキーはどうなっているのでしょうか?
nameをidにするとユニークを確保するのがかなり大変ですが大丈夫ですか?

//準備
create table seiseki(name varchar(20) primary key,school varchar(10),city varchar(10) null,point int not null,rank int null);
insert into seiseki(name,school,point) values ('kameda','1高',345),('suzuki','2高',341),('kaneko','3高',332),('yosida','2高',321),('tanita','1高',310),('suyama','1高',310),('kisida','2高',301),('komine','1高',299),('tomita',...続きを読む

Qソートした際の、特定のデータの番目を出したい

例として、id,count というフィールドを用意し、下記のようなデータを使用します。
id count
A 5
B 2
C 3

このデータから、Aは ORDER BY count DESC で何番目なのか、Bは、Cは、といった形で、各々が何番目なのかを取得することは可能ですか?
また、可能でしたらどのような方法が考えられるでしょうか。

単純な例で言うと count で降順にソートした際の、id A と id C の番目を取得したい。
(Aは0・Cは1、番目が1からの場合 Aは1・Cは2といったデータ)
といったピンポイントでピックアップしていくような使い方をしたいと思っています。
また、取得後はPHPでデータを利用します。

少ないデータなら、全てのデータを取得してからPHPで振り分けも可能ですが、大量のデータがある際に効率的にできないかと質問させていただきました。

よろしくお願い致します。
-----------------
環境
 PHP 5.2.5
 MySQL 5.1.22

Aベストアンサー

行番号を取得できれば
------------------------
SELECT ROW_NUM FROM
(SELECT [行番号] AS ROW_NUM, * FROM [テーブル] ORDER BY [ソート順])
WHERE
id in ('A', 'C')
------------------------
こんな感じでできると思いますが、
雰囲気つかめますでしょうか。

MySQLでの行番号の取得方法がわかりませんでした・・・orz

(oracle なら ROW_NUMBER関数 で取得できるのに・・・)

試してませんが

[行番号] を COUNT(id) + 1

にしてできませんかね^^;

QMySQLで改行を含む文の登録のしかた(改行コード

MySQLで改行を含む文を登録したいんですが、改行を改行コードに書き換えて登録したいです。
改行コードはどのように書けばいいですか?

登録したい文:
あいうえお
かきくけこ
さしすせそ

Aベストアンサー

改行コードは¥nで登録すれば良いです。

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

Q上から何番目か。

$sql = "select * from table_namae where no = 115 order by jikan desc";

の場合、上から何番目か知る方法がわからん。
時間でソートして、そのnoが上から何番目かを知りたい。
もちろん、レコードの値も欲しい。

NO 115を検索して
 タイトル 名前 パスワード
 → 時間でソートして上から?番目

noはPRIMARYで重複する値はなく常に一つだけ。
SQLで値を得る事は、無理?
noは特にその都度変わるので、limitは使えないと思うんですが。

PHPなら、ソートして最初から希望のナンバーまでのレコードを取得。
$i = 0;
 while($col = mysql_fetch_array($rst)){$i++;
if(希望のナンバー){
print "$i番目";
print "タイトル、名前さん。"} }

これでも、取得できるけど、無駄なループになるし。

Aベストアンサー

ちょっと、タイプミスが、

SELECT T1.no, T1.name, T1.title, T1.jikan, COUNT(T2.no) as bangou
FROM table_namae as T1,
table_namae as T2
WHERE T1.no = 115
AND T1.jikan >= T2.jikan
GROUP BY T1.no;

こっちです。
質問の意図を読み間違えてなければ、これでばっちり。

QDBエラーの意味

フォームからDBにデータ挿入しようとすると

Column count doesn't match value count at row 1

というエラーが出てしまいます・・・どういう意味を持ったエラーなんでしょうか?

Aベストアンサー

カラム数と値の数が合わない、と言う事です。簡単な英語なので覚えましょう。
カラム数が4つにもかかわらず、
"INSERT INTO tablename VALUES (1,'hoge',3)"
とやった場合等に出るエラーだと思います。

QMySQLでのランキングを作成するSQL

ランキングを作成する、効率の良いSQLを教えて下さい。

MySQLで、以下の状態です。

テーブル名:
hoge

カラム:
id,kbn,name,score,flg,date

id…自動
kbn…1~4
name…string
score…int
flg…bool
date…年月日

(1)dateが1週間以内のデータのみ
(2)flgがtrueのデータのみ
(3)kbn毎に、5レコード取得
(4)順位は、点数が重複している場合は同一の順位をつけSQLで生成しn位のフォーマット
(5)6レコード以降に同一スコアのデータがある場合は日付が古い順
(6)scoreは、n点のフォーマット
(7)該当データが5レコード存在しなかった場合は、順位だけをセットし他をnull

欲しい結果は、以下の状態です。
kbn,順位,name,score
1 ,1位 ,ホゲ,100点
1 ,2位 ,あい, 85点
1 ,2位 ,かき, 85点
1 ,4位 ,くけ, 70点
1 ,5位 ,さし, 65点
2 ,1位 ,すせ, 99点
2 ,1位 ,たち, 99点
2 ,3位 ,つて, 80点
  ・
  ・
  ・
4 ,4位 ,らり, 10点
null ,5位 ,null, null

以上、よろしくお願い致します。

ランキングを作成する、効率の良いSQLを教えて下さい。

MySQLで、以下の状態です。

テーブル名:
hoge

カラム:
id,kbn,name,score,flg,date

id…自動
kbn…1~4
name…string
score…int
flg…bool
date…年月日

(1)dateが1週間以内のデータのみ
(2)flgがtrueのデータのみ
(3)kbn毎に、5レコード取得
(4)順位は、点数が重複している場合は同一の順位をつけSQLで生成しn位のフォーマット
(5)6レコード以降に同一スコアのデータがある場合は日付が古い順
(6)scoreは、n点のフォーマット
(7)該当データが5レコード存...続きを読む

Aベストアンサー

//元データ
create table hoge(id int not null primary key,kbn int,name varchar(10),score int,flg tinyint,d date);
insert into hoge values(1,1,'a',100,1,'2014-03-10'),(2,1,'b',90,1,'2014-03-11'),(3,1,'c',80,1,'2014-03-12'),(4,1,'d',90,1,'2014-03-13'),(5,1,'e',80,1,'2014-03-10'),(6,1,'f',80,1,'2014-03-11'),(7,2,'g',0,1,'2014-03-12'),(8,2,'h',100,0,'2014-03-13'),(9,2,'i',100,1,'2014-03-10'),(10,2,'j',100,1,'2014-03-11'),(11,2,'k',100,1,'2014-03-12'),(12,2,'l',100,1,'2014-03-13'),(13,3,'m',100,1,'2014-03-10'),(14,3,'n',100,1,'2014-03-11');

とりあえず検索条件がかぶるので一度
(1)(2)をつかってビューを作ります。

//view作成
create view v_hoge as
select * from hoge
where d between curdate() - interval 1 week and curdate() + interval 1 week
and flg = 1;

//結果
select *
,(select count(*)+1 from v_hoge as v2 where v1.kbn=v2.kbn and v1.score<v2.score) as rank1
from v_hoge as v1
where kbn in (select kbn from v_hoge group by kbn having count(*)>=5)
having (select count(*)+1 from v_hoge as v2 where v1.kbn=v2.kbn and (v1.score<v2.score or v1.score=v2.score and v1.d>v2.d) ) <=5
order by kbn asc,rank1 asc;

(1)は「何の」一週間以内なのか不明。たぶん今日の?
また一週間とは前も先もあるので命題が中途半端

(4)と(6)のフォーマットはsql側でやらずに出力側のプログラムでやるべき
(キャストや結合が無駄なため)

(5)はkbnごとに日付がユニークでないと順位が決定できない

(7)は意味不明
5個データがないのに5位ってどういうこと?しかもkbnまでnullじゃ何を示しているか?

//元データ
create table hoge(id int not null primary key,kbn int,name varchar(10),score int,flg tinyint,d date);
insert into hoge values(1,1,'a',100,1,'2014-03-10'),(2,1,'b',90,1,'2014-03-11'),(3,1,'c',80,1,'2014-03-12'),(4,1,'d',90,1,'2014-03-13'),(5,1,'e',80,1,'2014-03-10'),(6,1,'f',80,1,'2014-03-11'),(7,2,'g',0,1,'2014-03-12'),(8,2,'h',100,0,'2014-03-13'),(9,2,'i',100,1,'2014-03-10'),(10,2,'j',100,1,'2014-03-11'),(11,2,'k',100,1,'2014-03-12'),(12,2,'l',100,1,'2014-03-13...続きを読む

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

QSELECT 文 GROUP での1件目を取得

非常に初歩的な事で恐縮ですが、
以下のデータを抽出するsql文の書き方を模索しています。
環境:SQLSERVER2005

| 列1| 列2 |
+---+---+
| 1 | A |
| 1 | B |
| 1 | C |
| 1 | D |
| 2 | F |
| 2 | G |
| 2 | H |
| 3 | X |
| 3 | Y |
| 3 | Z |

上記のテーブルがあるとします。
列1でグループした値で、1レコード目の列2を抽出したいのです。
出力結果としては、

列1列2
+--+--+
1,A
2,F
C,X

としたいのです。
列1でGROUPしてしまうと列2の内容を集約しないといけないので困っています。
ご教授いたけないでしょうか?

Aベストアンサー

SQL Server 2005では、Oracleでいう分析関数が実装されています。

select
列名1,
列名2
from
(select
rank() over(partition by 列1 order by 列2) as rk,
列1,列2
from 表名) as x
where rk=1

QMySQLで特定のグループの上位3件を取得したい。

ちょっと壁に当たったので、わかる範囲でお答え頂きたいのですが、
以下のようなテーブルがあったとします。

id user price date
1 A 1000 2013/5/31
2 A 1200 2013/6/1
3 B 1000 2013/5/20
4 A 1500 2013/5/12
5 C 1300 2013/5/31
6 C 1400 2013/5/14
7 C 1000 2013/5/6
8 B 1100 2013/5/24
9 B 1200 2013/5/30
10 B 1100 2013/5/4
11 A 1800 2013/4/12
12 C 900 2013/4/6
・・・

次に取得したいのは、

A 1200 2013/6/1
A 1000 2013/5/31
A 1500 2013/5/12
C 1300 2013/5/31
C 1400 2013/5/14
C 1000 2013/5/6
B 1200 2013/5/30
B 1100 2013/5/24
B 1000 2013/5/20

このようなデータなのですが、
条件:
1.userでグループ化したうちの日付降順で並べる
2.そのuserのデータの中で、日付降順で並べる
3.userのデータが複数あっても、取得するのは新しいものから3件のみ

この条件を満たすSQL文はどのように記述すればよいか、お知恵をお貸し下さい。
よろしくお願いします。

ちょっと壁に当たったので、わかる範囲でお答え頂きたいのですが、
以下のようなテーブルがあったとします。

id user price date
1 A 1000 2013/5/31
2 A 1200 2013/6/1
3 B 1000 2013/5/20
4 A 1500 2013/5/12
5 C 1300 2013/5/31
6 C 1400 2013/5/14
7 C 1000 2013/5/6
8 B 1100 2013/5/24
9 B 1200 2013/5/30
10 B 1100 2013/5/4
11 A 1800 2013/4/12
12 C 900 2013/4/6
・・・

次に取得したいのは、

A 1200 2013/6/1
A 1000 2013/5/31
A 1500 2013/5/12
C 1...続きを読む

Aベストアンサー

#1です。少し訂正が有ります。

複数の user の最新の日付が同じ場合に、それらのuserのデータが混ざって出力される可能性が有るので、ORDER BY句に user も含めるべきでした。


SELECT * FROM tbl_hoge a
WHERE (SELECT COUNT(*) FROM tbl_hoge b WHERE a.user = b.user AND a.date < b.date) < 3
ORDER BY
(SELECT MAX(date) FROM tbl_hoge c WHERE a.user = c.user) DESC,
user,
date DESC
;


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング