Quantcast
Channel: OKWAVE 最新質問([技術者向] コンピューター/205)【本日】
Viewing all articles
Browse latest Browse all 38062

効率的なSQL文をご教授ください。

$
0
0
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つ目のクエリでは、 関連記事が存在するかどうかの判定だけでも良いので、 何とか良い方法をご教授の程お願いいたします。

Viewing all articles
Browse latest Browse all 38062

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>