人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

●質問者: numb08
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● きゃづみぃ
●10ポイント

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


きゃづみぃさんのコメント
?2の回答をみて調べてみたら http://www.programming-magic.com/20080107233125/ というのが ありますね。

きゃづみぃさんのコメント
ちなみに これは 乱数の関数の使い方の説明みたいなものです。

2 ● うぃんど
●290ポイント ベストアンサー

二段階に分ける例

SELECT *
FROM (SELECT * FROM 成績 ORDER BY id DESC LIMIT 5) t
ORDER BY rand()
LIMIT 1

numb08さんのコメント
回答ありがとうございます。 記載を参考にしてみたのですが、ランダムに1個取り出せず DESCで並べた一番上のものばかりでてきました。

うぃんどさんのコメント
MySQLでテストしたものを書いています。 (回答用に「テーブル名」に直すべきところが「成績」のままになっているのが名残です。) rand() という具合に何も与えないようにしていますか? MySQLで rand( シード値 ) とするとシード値を元に値を生成してしまうため、常に同じ数値が返ってきます。

numb08さんのコメント
$bs = sprintf("SELECT * FROM (SELECT * FROM テーブル名 where id=1 ORDER BY id DESC LIMIT 5) t ORDER BY rand() LIMIT 1"); 抽出部分行の具体的な書き方は上記のような感じです。

numb08さんのコメント
上記記載ミスです。 where id=1 は where rssid=1 なのでORDER BY id の カラムとは別です。

うぃんどさんのコメント
SELECT * FROM テーブル名 WHERE rssid=1 ORDER BY id DESC LIMIT 5; の結果が「実は常に一件だけである」というようなことはないですか?

うぃんどさんのコメント
どうしてsprintfを使っているのか謎ですが…。 php側でSQLを合成しているのなら、 phpのrand関数でn番目の一行分というSQL文を作ってしまったほうが良かったのかな? >|php| $bs = 'SELECT * FROM テーブル名 WHERE rssid1=1 ORDER BY id DESC LIMIT ' . rand(1,5) . ',1'; ||< 上の式で$bsに入る文字列は下記5つのいずれかになります。 >|sql| 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 ||<

numb08さんのコメント
上記記載のとおり単体で動かしてみました $res = mysql_query('SELECT * FROM テーブル名 ORDER BY rss_day DESC LIMIT ' . rand(1,8) . ',1') or die(mysql_error()); これで希望の通りの動作になりました。 最初のsprintfのほうではまだだめでしたが。 もう少し勉強してみます。 ご丁寧に対応していただきありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ