あるテーブルを特定のカラムでグループに分けて, それらのグループからn件ずつデータを取り出す方法です。
1 2 3 4 5 6 7 8 9 10 11 |
SELECT * FROM news as A WHERE A.id IN ( SELECT B.id FROM news as B WHERE A.category = B.category ORDER BY B.date DESC LIMIT 8 ) |
上記のSQL文ではn=8でデータを取り出しています。
phpなどで, 言語のバージョンが古くて上記のコードが使えない場合には, 以下の方法で実現することができます。
1 2 3 4 5 6 7 8 9 10 11 |
SELECT t1.category, t1.date FROM news as t1 WHERE 8 >= ( SELECT COUNT(*) FROM news as t2 WHERE t1.category = t2.category AND t2.date > t1.date ) ORDER BY t1.category DESC |
少々理解するのか難しいSQL文になってしまいましたが, これでn件ずつデータを取り出すことができます。
しかし, このSQL文で注意しておきたいこととして, この場合はdateカラムに関して条件を指定して8件ずつ取り出そうとしているわけですが, 例えばcategoryとdateが全く同じレコードが10件だけ存在しているテーブルがあるとすると,
1 2 3 |
AND t2.date > t1.date |
の条件に引っかかるレコード数は0になり, 常に8以下になってしまいます。
すると, カテゴリごとに8件ずつ取り出したいにも関わらず, 10件取り出されてしまうことになります。
したがって, 絶対にn件ずつ取り出したときや, dateのような条件に指定するカラムがユニークではない場合, あるいは同じ値が複数存在する場合には, この方法はあまり使用しない方がいいでしょう。