MySQLの初級者です。 下記のようなテーブル構造があります。 article_flag ------------- ------------- aid display ------------- ------------- 1 1 ------------- ------------- 2 1 ------------- ------------- 3 1 ------------- ------------- 4 2 ------------- ------------- ...Primary(aid)、INDEX(display) category ------------- ------------- cid name ------------- ------------- 1 カテゴリ1 ------------- ------------- 2 カテゴリ2 ------------- ------------- 3 カテゴリ3 ------------- ------------- 4 カテゴリ4 ------------- ------------- ...Primary(cid)、INDEX(name) article_category ------------- ------------- aid cid ------------- ------------- 1 1 ------------- ------------- 1 4 ------------- ------------- 2 1 ------------- ------------- 2 2 ------------- ------------- 2 4 ------------- ------------- 4 1 ------------- ------------- 4 2 ------------- ------------- ...INDEX(cid aid) このような構造の中で、 下記のような出力を行いたいのです。 カテゴリ1 【関連記事 2件】 カテゴリ2 【関連記事 1件】 カテゴリ4 【関連記事 2件】 非表示中の記事(display = 2)は関連記事に上がらず、 関連記事の存在しないカテゴリは出力しないという仕様です。 この場合、どのようなSQL文で対処すればよろしいでしょうか? 現状では、 SELECT c.cid, c.name FROM category as c INNER JOIN article_category as ac ON c.cid = ac.cid INNER JOIN article_flag as af ON ac.aid = af.aid and af.display = '1' GROUP BY c.cid ORDER BY c.name ASC limit 10; というSQL文でまずは抽出してから、 抽出後のPHPのループ内で、 SELECT count(ac.cid) FROM article_category as ac INNER JOIN article_flag as af ON ac.aid = af.aid WHERE af.display = '1' and ac.cid = '{取得したcid}'; とカウントして関連記事数を出すという 回りくどいやり方しか思いついていません。 また例では件数が少ないですが、 実際には、article_flagが500件、categoryが200件あり、 一つの記事に平均で10個近いカテゴリが割り当てられているため、 article_categoryの件数は5000件近くあります。 そのため、最初のSQLクエリがとても遅く、 早くても10秒くらいかかります。 基本的にはlimit 10で10件限定の表示のため、 2番目のクエリは特に重さを感じません。 1つ目のクエリで一度に関連記事数まで取得できれば最善ですが、 難しい場合には、1つ目のクエリでは、 関連記事が存在するかどうかの判定だけでも良いので、 何とか良い方法をご教授の程お願いいたします。
↧