PHP + MYSQLでの抽出条件について


特定のカラム(id)を降順で並べ上から5件抽出し、さらにその5件の中からランダムに1件選ぶようにしたいです。

無知なりにやってはみたのですが
select * from テーブル名 where order by id DESC limit 5
この後ろに ,rand() limit1
ではだめでした。

何か良い記載方法はないでしょうか。
どうぞご教授お願い致します。

回答の条件
  • 1人10回まで
  • 登録:2013/03/07 16:57:57
  • 終了:2013/03/07 23:37:51

ベストアンサー

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492013/03/07 17:11:08

ポイント290pt

二段階に分ける例

SELECT *
FROM (SELECT * FROM 成績 ORDER BY id DESC LIMIT 5) t
ORDER BY rand()
LIMIT 1
他5件のコメントを見る
id:windofjuly

どうしてsprintfを使っているのか謎ですが…。

php側でSQLを合成しているのなら、
phpのrand関数でn番目の一行分というSQL文を作ってしまったほうが良かったのかな?

$bs = 'SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT ' . rand(1,5) . ',1';

上の式で$bsに入る文字列は下記5つのいずれかになります。

SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT 1,1
SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT 2,1
SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT 3,1
SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT 4,1
SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT 5,1
2013/03/07 22:29:32
id:numb08

上記記載のとおり単体で動かしてみました

$res = mysql_query('SELECT * FROM テーブル名 ORDER BY rss_day DESC LIMIT ' . rand(1,8) . ',1') or die(mysql_error());

これで希望の通りの動作になりました。
最初のsprintfのほうではまだだめでしたが。
もう少し勉強してみます。
ご丁寧に対応していただきありがとうございました。

2013/03/07 23:36:36

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13481ベストアンサー獲得回数11982013/03/07 17:09:44

ポイント10pt

http://php.plus-server.net/function.shuffle.html
5件 そのまま取得して 配列にセットし、
その配列をシャッフルして1件目を取得というのでは いかがでしょうか?

id:taknt

№2の回答をみて調べてみたら
http://www.programming-magic.com/20080107233125/
というのが ありますね。

2013/03/07 17:23:15
id:taknt

ちなみに これは 乱数の関数の使い方の説明みたいなものです。

2013/03/07 17:25:49
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492013/03/07 17:11:08ここでベストアンサー

ポイント290pt

二段階に分ける例

SELECT *
FROM (SELECT * FROM 成績 ORDER BY id DESC LIMIT 5) t
ORDER BY rand()
LIMIT 1
他5件のコメントを見る
id:windofjuly

どうしてsprintfを使っているのか謎ですが…。

php側でSQLを合成しているのなら、
phpのrand関数でn番目の一行分というSQL文を作ってしまったほうが良かったのかな?

$bs = 'SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT ' . rand(1,5) . ',1';

上の式で$bsに入る文字列は下記5つのいずれかになります。

SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT 1,1
SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT 2,1
SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT 3,1
SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT 4,1
SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT 5,1
2013/03/07 22:29:32
id:numb08

上記記載のとおり単体で動かしてみました

$res = mysql_query('SELECT * FROM テーブル名 ORDER BY rss_day DESC LIMIT ' . rand(1,8) . ',1') or die(mysql_error());

これで希望の通りの動作になりました。
最初のsprintfのほうではまだだめでしたが。
もう少し勉強してみます。
ご丁寧に対応していただきありがとうございました。

2013/03/07 23:36:36

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

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

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

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

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