効率的なSQL文をご教授ください。
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つ目のクエリでは、
関連記事が存在するかどうかの判定だけでも良いので、
何とか良い方法をご教授の程お願いいたします。
お礼
ご回答ありがとうございます。 >年賀状・暑中見舞い 郵便局(郵政省)が猛反発して、あらゆる手段を使って妨害に出るででょうが どこかの大手の会社が 年賀状管理サイトを作ってくれればと思います。 お気持ちはよく分かりますが・・・ 年末・年始の楽しく嬉しい風習行事だとも思います。 枚数は別として、親しき友人や同窓生(学校・会社)に、互いの無事を近況を知らせ合うのに良き伝統だと思います。 年々減り行く淋しさ、決して増える事のない、大切な由縁の人たち、人生の同志や恩人のような気持ちがします。