0

分類 Web サイトには 9 つのカテゴリがあります。ユーザーがキーワードを検索すると、検索結果と各カテゴリの検索結果の数を表示したいと考えています。

SQLクエリを最適化するには?

私は何を試しましたか?カテゴリごとにループを実行します。

select * from ads where title like '%keyword%';
select count(*) from ads where title like '%keyword%' and category_id = 1;
select count(*) from ads where title like '%keyword%' and category_id = 2;
select count(*) from ads where title like '%keyword%' and category_id = 3;
select count(*) from ads where title like '%keyword%' and category_id = 4;
.....

SQLクエリを高速化するためのより良い提案はありますか?

4

3 に答える 3

0

IF() (mysql の場合)、またはケース/より一般的な場合は、カウントを sum() できます

select 
      count(*) as TotalAds,
      sum( case when category_id = 1 then 1 else 0 end ) as TotalCategory1,
      sum( case when category_id = 2 then 1 else 0 end ) as TotalCategory2,
      sum( case when category_id = 3 then 1 else 0 end ) as TotalCategory3,
      sum( case when category_id = 4 then 1 else 0 end ) as TotalCategory4,
      sum( case when category_id = 5 then 1 else 0 end ) as TotalCategory5,
      sum( case when category_id = 6 then 1 else 0 end ) as TotalCategory6,
      sum( case when category_id = 7 then 1 else 0 end ) as TotalCategory7,
      sum( case when category_id = 8 then 1 else 0 end ) as TotalCategory8,
      sum( case when category_id = 9 then 1 else 0 end ) as TotalCategory9
   from
      ads 
   where 
      title like '%keyword%';
于 2013-04-09T03:54:07.110 に答える
0

nickles80 のクエリが機能します。ただし、1 つのクエリで両方を実行する場合は、次のようにします。

SELECT ads.*, cnt.CountResult
FROM ads
INNER JOIN (
    SELECT category_id, COUNT(1) AS CountResult
    FROM ads 
    where title like '%keyword%' 
    GROUP BY category_id
) cnt ON cnt.category_id = ads.category_id
where title like '%keyword%' 
于 2013-04-09T02:16:33.477 に答える