【初心者必見】php mysqlで1レコードをランダムに表示する方法

このQ&Aのポイント
  • phpとmysqlを使用して、データベースから特定の条件に一致する1つのレコードをランダムに表示する方法を解説します。初心者の方でも理解しやすく、具体的なスクリプトも紹介します。
  • データベースから特定の条件に一致するレコードをランダムに表示する方法を解説します。phpとmysqlを使用して、サブクエリを使う方法を紹介します。初心者の方もわかりやすく説明しています。
  • phpとmysqlを使用して、データベースから特定の条件に一致するレコードをランダムに表示させる方法を詳しく解説します。サブクエリの使い方にも注目してください。初心者の方にもわかりやすく説明しています。
回答を見る
  • ベストアンサー

php mysql で1レコードをランダムに表示させる方法

プログラム初心者です。 以下、ご指南頂けると幸いです。 データ ----------------------------------------------- id category  txt 1  1     テキスト1 2  1     テキスト2 3  2     テキスト3 4  1     テキスト4 5  1     テキスト5 6  2     テキスト6 上記のようなデータの中から「category」が「1」のレコードをランダムに1つ抽出したいと思っています。 $cat= 1; $query = "SELECT * FROM テーブル名 ORDER BY rand() LIMIT 1 >= (SELECT category = '$cat' FROM テーブル名)"; 上記のスクリプトですとエラーが出てしまいます。 サブクエリの使い方が現状であまり理解していないのだと思います。 本を見たり、検索したりしてるのですがつまづいて、もうかなりの時間が経っているので質問する事にしました。 どうぞ、よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • tumeno
  • ベストアンサー率41% (5/12)
回答No.1

$query = "SELECT * FROM テーブル名 where category = '$cat' ORDER BY rand() LIMIT 1"; ではどうでしょうか。

oku4649
質問者

お礼

ありがとう御座います! 解決しました!!

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

SELECT * FROM テーブル名 WHERE category = '$cat' ORDER BY rand() LIMIT 1 ――とか。試さないで書いてますが。

関連するQ&A

  • php mysql で WHERE句内に変数を入れる方法を教えてください。

    php初心者です。 お世話にになります。 id  content 1  テキスト1 2  テキスト2 3  テキスト3 4  テキスト4 5  テキスト5 上記のようなデータベースです。 下記の文で5行目のテキストを抽出する事は出来ています。 $query = 'SELECT * FROM tbl_batsu WHERE id = 5'; ランダム整数を生成し、5つの中から一つランダムにデータを抽出したいと考えています。 $num = rand(1, 5); $query = 'SELECT * FROM tbl_batsu WHERE id = $num'; 上記ですとエラーが出てしまいます。 Query failed: Unknown column '$num' in 'where clause' そんなカラムはありませんという意味だとは思いますが・・・ 初心者なもので的外れな質問になっているかも知れませんが、解決策が分かる方は是非ご教授頂ければありがたいです。 よろしくお願いします。

    • 締切済み
    • PHP
  • ランダムに1データだけ抽出したい

    「おみくじ」みたいなものを作っています。 MYSQLにautoincrementでデータを蓄積しています。 PHPから1データだけランダムに取り出そうと以下の構文で抽出しています。 select * from data order by Rand() LIMIT 0,1; データ数はかなり貯まっているのですが、同じようなデータばかり抽出しているような気がしています。 これは気のせいでしょうか? また、データをしょっちゅう削除していたので、番号が飛び飛びになっています。 1.2.3.5.8.9.10.のような感じです。 このように歯抜けの状態でもRand()はちゃんと存在するデータからランダムに選んでいるのでしょうか?

    • ベストアンサー
    • MySQL
  • phpの二次元配列の値をランダムに取得したい

    ちょっとわからないことがありますので、質問させて頂きます。MYSQLから取得したデータ(二次元配列)から、ランダムに値を10件取得したいと思っております。 実際、DBにクエリを投げる段階で、 "select id,name,description from teble order by rand()" をしても、そのテーブルにあるデータ全体から取得という感じになってしまいます。 新しく追加されたデータ10件から、ランダムに取得できないので、新しく追加されたデータ10件をまずDBから取得して、php側でその中からランダムに値を取得するしかないのかと思っております。 shuffle();等を使用したのですが、配列のキーをランダムに取得するような形で、その中身を一緒に取得することができません。 考えても私の知識では解決できませんので、お分かりになる方、ご教授くださいますようお願いいたします。

    • 締切済み
    • PHP
  • PHP+MYSQLでレコードをランダム取得しページング

    PHP+MYSQLでMYSQLから特定キーの「昇順」や「降順」などでは無くランダムな順番で全てのレコードを取得し、複数ページに出力させたいと考えています。 1枚のページであれば、MYSQLで取得したデータを配列に入れて、array_randといった方法があるかと思いますが、"複数ページに渡って重複させず"にデータをランダム出力させるにはどのような方法があるでしょうか? 自分では並び順カラム(sort_num)を作成し、cronなどで定期的にランダムな数値を全レコードのsort_numに挿入し、ORDER BY sort_num LIMIT $pagestartrecord,$pageendrecord といった力技でページングする方法しか思いつきませんでした。 お力をお貸し願えたらうれしいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • サブクエリでLIMITが使用できない件

    こんばんは。 サブクエリ内でランダムに5件を対象にしようとLIMITをかけてみたのですが、エラー表示されてしまい、調べてみるとサブクエリでLIMITは使えない、と書かれています(いくつかのサイトでは)。 この場合、最初にLIMITを入れたクエリを実施し、その結果を仮想テーブルのように扱い、それをサブクエリの対象にするしか方法は無いのでしょうか? またその場合「クエリのクエリ」になると思うのですが、 クエリ結果を仮想テーブルとして扱う場合の方法が良くわからず、 そこも教えていただけますと幸いです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpとmysqlでデータの一覧表示をしたいと思っています。

    phpとmysqlでデータの一覧表示をしたいと思っています。 ずらーっと並べるだけでなく、1ページに100件した場合には 10行毎に<hr>や<br>などのタグを挿入して間隔を空けたいのですが どのようにしたらいいのか悩んでいます。 現在は下記のようにLIMITで何度もqueryを発行しています。 できれば1回のqueryで処理したいのですが 他にどのような方法があるでしょうか。 $rs = mysql_query("select * from data order by id desc LIMIT 0,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } $rs = mysql_query("select * from data order by id desc LIMIT 10,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } $rs = mysql_query("select * from data order by id desc LIMIT 20,10 ;",$conn); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $site = $rec['site']; $url = $rec['url']; echo '<a href="'.$url.'">'.$site.'</a>'; } よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 複数のSQLを合体させる方法

    環境:XP&Apache2&MySQL5&PHP5 examinというテーブルがあります。 全部で80レコードあり、このうちの20レコードを任意に表示させます。 $qq ="select * from examin ORDER BY RAND() LIMIT 20"; $qu = mysql_query($qq); while($ro=mysql_fetch_assoc($qu)) { ここまでは出来るのですが、 examinのフィールドに表示させる順番を持たせ、(grpaというフィールド名にしました) 例えばgrpaが値1のもの(実際は4レコード)を任意に1レコード最初に表示させ、 grpaが値3のもの(実際は3レコード)を任意に1レコード3番目に表示させ、 grpaが値20のもの(実際は6レコード)を任意に1レコード20番目に表示させる、 という方法がわかりません。 $qq1 ="select * from examin where `grpa`=1 ORDER BY RAND() LIMIT 1"; $qu1 = mysql_query($qq1); $qq2 ="select * from examin where `grpa`=2 ORDER BY RAND() LIMIT 1"; $qu2 = mysql_query($qq2); -- $qq20 ="select * from examin where `grpa`=20 ORDER BY RAND() LIMIT 1"; $qu20 = mysql_query($qq20); とやって最後に while($ro=mysql_fetch_assoc($qu)) { の$quの部分を加工すればいいのかな、とも思いますが、 どうすればいいか思いつきません。 アドバイスいただけると幸いです。

    • ベストアンサー
    • PHP
  • MySQLのサブクエリ

    おせわになっております。 MySQLを愛用していますが、気になる疑問にぶつかりましたので、質問させてください。 ★MySQLの4.1系のサブクエリは、性能が悪いのですか? たとえば select * from t1 where key in ( select key from t2 where key2 in ( select key2 from t3 where col = 1)) のようなことをしようとしたとき、ものすごく遅いことがあります。 あきらめて、クエリを分けて、小分けに実行すれば、速いです。 サブクエリなどを高速に実行させる方法などありますでしょうか?MySQL5では違うものなのでしょうか? よろしくお願いします

  • mysql_fetch_arrayとテンプレートの使い方

    データベースからランダムに取り出した3つのデータがあります。 取り出したデータにはそれぞれid、name、ageのデータが入っています。 $rs = mysql_query("select * FROM table order by Rand() LIMIT 0,3;",$con); while($rec = mysql_fetch_array($rs, MYSQL_ASSOC)){ $tpl->assign(array( id => $rec[id], name => $rec['name'], age => $rec[age] )); } これだと1種類のデータが3つ連続して表示されてしまいました。 3種類のデータを全部表示するにはどのようにしたらよいのでしょうか? テンプレート(?)の使い方がよく分かっていないので検討違いのことをしている気がしますがよろしくお願いします。

    • ベストアンサー
    • MySQL
  • MySQL 条件での絞込みがうまくいきません

    下記の質問をさせていただき、解決いたしましたが、それに関連して新たなご質問です。 http://okwave.jp/qa/q8830319.html 上記質問内容は、 以下のようなデータから、「結果」のような形でデータを取り出したいというもので、「いただいたご回答」の形で一旦解決しました。 usr テーブル +--------+------+ | usr_id | name | +--------+------+ | 1 | 太郎 | | 2 | 二郎 | | 3 | 花子 | +--------+------+ usr_trm テーブル +--------+--------+ | usr_id | trm_id | +--------+--------+ | 1 | 1 | | 1 | 3 | | 1 | 4 | | 2 | 1 | | 2 | 2 | | 2 | 3 | | 3 | 2 | +--------+--------+ cat テーブル +--------+------+ | cat_id | name | +--------+------+ | 1 | 性別 | | 2 | 部署 | +--------+------+ trm テーブル +--------+--------+------+ | trm_id | cat_id | name | +--------+--------+------+ | 1 | 1 | 男性 | | 2 | 1 | 女性 | | 3 | 2 | 総務 | | 4 | 2 | 経理 | +--------+--------+------+ 結果 +--------+------+------+------+ | usr_id | name | cat1 | cat2 | +--------+------+------+------+ | 1 | 太郎 | 1 | 3,4 | | 2 | 二郎 | 1,2 | 3 | | 3 | 花子 | 2 |   | +--------+------+----- +------+ いただいたご回答 select t1.usr_id,t3.name ,group_concat(if(cat_id=1,t1.trm_id,null)) as cat1 ,group_concat(if(cat_id=2,t1.trm_id,null)) as cat2 from usr_trm as t1 inner join trm as t2 on t1.trm_id=t2.trm_id inner join usr as t3 on t1.usr_id=t3.usr_id group by usr_id さらにそこから、例えば「総務に所属する人をランダムにn件」という形で絞り込もうと思い、 WHERE t2.trm_id=3 と ORDER BY RAND() LIMIT 10 を追加したところ、条件通り抽出はされるのですが、結果の「cat1」「cat2」に他のカテゴリーの値が入らなくなりました。 WHERE t2.trm_id=3 を消すと「cat1」と「cat2」に値が入ってきます。 「cat1」と「cat2」に全ての値が入った状態で絞込をするために、どのようにすればよいかわかりません。 アドバイスをいただけると幸いです。

    • ベストアンサー
    • MySQL

専門家に質問してみよう