質問: $db->query("select blog.id,blog.title,blog.url, blog.name from blog,site where blog.name=site.name AND site.henkan <= 2 AND site.rsscount < 10 AND blog.date > CURRENT_TIMESTAMP + INTERVAL - 24 HOUR order by rand() limit 1"); ``` 上の条件を削った、抽出条件では正常に抽出する事が出来ました。 --- テーブル名:siteのカラム名:henkan(還元率)の値が「2」以下でなおかつ テーブル名:siteのカラム名:rsscount(紹介回数)の値が「10」未満でなおかつ テーブル名:siteのカラム名:incount(登録ブログから送って貰えた値)の値の上位5位のブログでなおかつ テーブル名:blogのカラム名:date(記事の更新日時)が「24時間」以内の登録しているブログの記事を ランダムにシャッフルして抽出します。 この抽出する条件の テーブル名:siteのカラム名:incount(登録ブログから送って貰えた値)の値の上位5位のブログでなおかつ テーブル名:blogのカラム名:date(記事の更新日時)が「24時間」以内の登録しているブログの記事を ランダムにシャッフルして抽出します。 この部分を解決する方法を ネットで調べたり、ドットインストールさんで調べても 上手く抽出する事が出来ませんでした。 解決方法をご存知の方や 何かお気付きの点がある方がいらっしゃいましたら お力をお貸し頂けると嬉しいです。 どうかよろしくお願いします。
回答: order by rand()は使ったことがないので別の考え方を。 要は抽出したレコードに乱数を追加し、その乱数でソート、上位5件を取ってくれば良いのですよね。 次のようなSQLにしてはどうでしょうか(未検証) ``` select * from ( select * from ( select rand() as randnum, blog.id,blog.title,blog.url,blog.name from blog,site where blog.name=site.name AND site.henkan <= 2 AND site.rsscount < 10 AND blog.date > CURRENT_TIMESTAMP + INTERVAL - 24 HOUR ) order by randnum limit 5 ) order by incount desc ``` 追記 なんとなく自分なりに解釈して修正してみました。 考え方のコメント付き(順番通り見てください) 動作は未検証です。 ``` select * from ( --4抽出した各レコードに乱数を付加 select rand() as randnum, * from ( --1siteから上位5件を抽出 select name from site where henkan <= 2 and rsscount < 10 order by incount desc limit 5 ) as t1 --2抽出した5件のsiteごとにblogレコードを結合 left join blog as t2 on t1.name=t2.name --3blog記事を24時間以内に限定 where t2.date > CURRENT_TIMESTAMP + INTERVAL - 24 HOUR --5乱数順に並び変え ) order by randnum; ```