1

次のクエリがあります。

SELECT 
    `people`.`surename`, 
    calcWeight(`people`.`surname`,'kiera',6)
    as `weight`
FROM
    `people`
LEFT JOIN
    `dogs`
ON
    `people`.`id` = `dogs`.`owner` 
ORDER BY 
    `weight` DESC 

問題は、すべての結果 where を削除する必要があることです。これは、計算している値が 0 の場合です。WHERE > 0weightになると思いましたが、where 句の後まで存在しないようです。計算された場所を移動するつもりなのか、WHEREを移動するつもりなのかわかりません。weightweightweight

やりたくない

 WHERE calcWeight(`people`.`surname`,'kiera',6) > 0

calcWeight は計算に時間がかかり (数千行で発生している場合)、結果をキャッシュして再利用するかどうかわからないためです。

どんな助けやアドバイスも素晴らしいでしょう!ありがとうございました !

4

2 に答える 2

3

サブクエリでこれを行う最良の方法:

select t.*
from (SELECT `people`.`surename`, calcWeight(`people`.`surname`,'kiera',6) as `weight`
      FROM `people` LEFT JOIN
           `dogs`
           ON  `people`.`id` = `dogs`.`owner` 
     ) t
where weight > 0
ORDER BY `weight` DESC 
于 2012-10-07T17:37:07.737 に答える
2

句の直前にORDER BY、 を追加しHAVING weight > 0ます。 HAVING句は、句で設定した集計関数とエイリアスを参照できますSELECT

WHEREとの違いはHAVINGWHERE結果セットが射影される前にHAVING実行され、実際に射影された結果セットで実行されることです。したがって、インデックスを使用する機会が増えます (フィルターがインデックスをまったく使用できWHEREないと思います)が、もう少し柔軟です。可能な場合は使用し、それ以外の場合は使用してください。HAVINGHAVINGWHEREHAVING

于 2012-10-07T17:31:07.527 に答える