質問: PHP&MySQL hatenaというDBに wordとnumber、whyというカラムがあります。 wordには文字が入っておりnumberにはauto_incrementで振った番号が入っており、whyには0から10まで数字が入っています。 word like '%$search_word%'のような感じで検索し、whyに入っている数が多い順で表示するにはどうしたらいいのでしょうか?この際にwhyの数が同じ場合はnumberに入っている数が多い順に表示させたいと思っています。また、データ量が多いので、10レコードづつ表示することも考慮してください。 簡単なソースなどお願いします。
回答: SQLは以下のようになります。 ``` SELECT * FROM hatena WHERE word like '%$seach_word%' ORDER BY why DESC, number DESC LIMIT 0, 10 ; ``` whyの降順(値が大きい順)、numberの降順でソートします。 このように複数条件をORDER BY句に指定することで1つ目の条件が一致する行を2つ目の条件でソートすることができます。 LIMITの意味は2つ引数を取る場合、1つ目の引数分の検索結果を無視(OFFSET)して、2つ目の引数の行数だけ値を返します。 上記の例では、1行目(0行無視)から10行分の検索結果を取得します。 以下のようにすることで、11行目から10行分の検索結果を取得することができます。 ``` SELECT * FROM hatena WHERE word like '%$seach_word%' ORDER BY why DESC, number DESC LIMIT 10, 10 ; ``` これを応用すれば10行ずつ取得することが可能です。 LIMITの1つ目の引数の値を10ずつインクリメントすることで、10行ずつ取得できます。 最初に ``` SELECT COUNT(*) FROM hatena WHERE word like '%$seach_word%' ; ``` として検索条件に合う行数を取得しておき、その値を元にLIMITの1つ目の引数を10ずつインクリメントするようにPHP側でSQLを加工することで、ご要望の機能を実現できます。 参考になれば幸いです。