1

COUNTを実行するSELECTステートメントが3つあります。これらを組み合わせると、mysqlの方が効率的で親切になると思いました。

$query = $db->query("SELECT count(category) FROM table WHERE cid='290463' and category = 'x'"); 
         $tot_x = $db->result($query, 0);

$query = $db->query("SELECT count(category) FROM table WHERE cid='290463' and category = 'y'"); 
         $tot_y = $db->result($query, 0);

$query = $db->query("SELECT count(category) FROM table WHERE cid='290463' and category = 'z'"); 
         $tot_z = $db->result($query, 0);

1つのステートメントに:

SELECT 
    SUM(category='x' AND cid='290463') as tot_x, 
    SUM(category='y' AND cid='290463') as tot_y, 
    SUM(category='z' AND cid='290463') as tot_z 
FROM table

問題は、新しいステートメントが元の3つを個別に実行するよりも遅いことです。

新しいステートメントが遅い理由と、SELECTをより速くするための推奨事項を明らかにできる人はいますか?

4

2 に答える 2

3

元のクエリはおそらく(where句に基づいて)テーブルのインデックスを利用でき、統合クエリのようにテーブル全体ではなく、テーブルのレコードの比較的小さな割合だけが読み取られるようにしました。次のように、同等の条件をwhere句に追加してみてください。

SELECT 
    SUM(category='x') as tot_x, 
    SUM(category='y') as tot_y, 
    SUM(category='z') as tot_z 
FROM table
WHERE cid='290463' and category in ('x', 'y', 'z')
于 2013-01-29T13:04:29.080 に答える
0
SELECT 
    SUM(IF(category='x',1,0))as tot_x, 
    SUM(IF(category='y',1,0))as tot_y, 
    SUM(IF(category='z',1,0))as tot_z
FROM table
WHERE cid='290463'
GROUP BY category
于 2013-01-29T13:03:43.593 に答える