0

正常に動作するクエリがありますが、同じサブクエリが 2 つあります。

SELECT *, 
    (SELECT count(O.id) FROM `offer` O WHERE O.product_id = P.id) AS poffers 
FROM `product` P 
JOIN product_section PS ON (PS.product_id = P.id AND PS.section_id IN (14)) 
WHERE P.deleted is NULL 
    AND (SELECT count(O.id) FROM `offer` O WHERE O.product_id = P.id) > 0 

JOIN で最適化しようとしましたが、新しいクエリは空の結果を返します

SELECT *, OJ.pcount AS poffers
FROM `product` P 
JOIN product_section PS ON PS.product_id = P.id AND PS.section_id IN (14)
JOIN (SELECT count(O.id) AS pcount, O.product_id FROM `offer` O ) 
    AS OJ ON OJ.product_id = P.id
WHERE P.deleted is NULL AND OJ.pcount > 0 

変数を試してみましたが、間違って使用したと思いますが、クエリは空の結果を返します

SELECT *,  
    @o := (SELECT count(O.id) FROM `offer` O WHERE O.product_id = P.id) 
    AS poffers 
FROM `product` P 
JOIN product_section PS ON (PS.product_id = P.id AND PS.section_id IN (14)) 
WHERE P.deleted is NULL 
    AND @o > 0 
4

2 に答える 2

1

依存サブクエリは避けてください。代わりに、製品をオファー数に関連付けるクエリを 1 つ用意します。このクエリは、いくつかの場所で使用できます。計算の重複を避けて一時的にメモリに保存される可能性が高いですが、データベース エンジンはさらに賢い処理を行う可能性もあります。

SELECT *, O.cnt AS poffers
FROM product P
JOIN product_section PS ON (PS.product_id = P.id AND PS.section_id IN (14))
JOIN (SELECT product_id, count(id) AS cnt
      FROM offer
      GROUP BY product_id
     ) O ON (O.product_id = P.id)
WHERE P.deleted is NULL AND O.cnt > 0

P と PS の関係が 1 対 1 の場合、サブクエリがまったくなくても作業できます。

SELECT *, COUNT(O.id) AS poffers
FROM product P
JOIN product_section PS ON (PS.product_id = P.id AND PS.section_id IN (14))
JOIN offer O ON (O.product_id = P.id)
WHERE P.deleted is NULL
GROUP BY P.id

また、特定の列を数える正当な理由があるかどうかも検討する必要があります。ほとんどの場合、COUNT(*)よりも高速になりCOUNT(col)ます。NULL後者を使用する唯一の理由は、明示的にカウントから値を除外したい場合です。

于 2012-07-26T16:13:17.417 に答える