2

私は次のような厄介なMySQLクエリを持っています:

SELECT camera_id, ((avg(low_price) + avg(high_price)) / 2) as avg_price
FROM camera_general, camera_products
WHERE camera_id = ir_camera_id
AND dp_post_dt IS NOT NULL
AND dp_post_dt NOT LIKE '0000%'
AND currently_manufactured = 'Yes'
AND ((no_of_sellers >= 0) OR ((TO_DAYS(CURRENT_DATE) - TO_DAYS(dp_post_dt)) < 120))
AND avg_price < 150 
AND camera_id != 1411
AND camera_id != 9
ORDER BY rand();

これにより、「where句'の不明な列'avg_price'」エラーが発生しました。これは、WHERE句で列エイリアスが許可されていないためだと理解しています。(私が行くときにこれのいずれかが間違っている場合は私を訂正してください。)

だから、私は次のようにクエリを微調整しました:

SELECT camera_id, ((avg(low_price) + avg(high_price)) / 2) as avg_price
FROM camera_general, camera_products
WHERE camera_id = ir_camera_id
AND dp_post_dt IS NOT NULL
AND dp_post_dt NOT LIKE '0000%'
AND currently_manufactured = 'Yes'
AND ((no_of_sellers >= 0) OR ((TO_DAYS(CURRENT_DATE) - TO_DAYS(dp_post_dt)) < 120))
AND ((avg(low_price) + avg(high_price)) / 2) < 150 
AND camera_id != 1411
AND camera_id != 9
ORDER BY rand();

エイリアスを実際の計算に置き換えると、このクエリで「グループ関数の使用が無効です」というエラーが発生しました。これは、WHERE句が処理を完了するまでavg()が発生しないためだと理解しています。

だから私は試しました:

SELECT camera_id, ((avg(low_price) + avg(high_price)) / 2) as avg_price
FROM camera_general, camera_products
ORDER BY rand();
HAVING camera_id = ir_camera_id
AND dp_post_dt IS NOT NULL
AND dp_post_dt NOT LIKE '0000%'
AND currently_manufactured = 'Yes'
AND ((no_of_sellers >= 0) OR ((TO_DAYS(CURRENT_DATE) - TO_DAYS(dp_post_dt)) < 120))
AND avg_price < 150 
AND camera_id != 1411
AND camera_id != 9;

WHEREをHAVINGに置き換えると、このエラーが発生しました。「SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、「HAVING camera_id=ir_camera_id」の近くで使用する正しい構文を確認してください。」

そしてこの時点で、私はこのクエリを機能させるために暗闇の中で撮影しているように感じます。誰かがこれを機能するクエリにするために正しい方向に私を導きますか?

ありがとう!

4

2 に答える 2

2
  1. WHERE結合条件を指定するために使用できますが、LEFT[INNER] JOIN句で行うことをお勧めします。
  2. 非集計フィールドでフィルタリングする場合は、にフィルタを配置します。WHERE集計でフィルタリングする必要がある場合は、条件をに移動します。HAVING
  3. 同じクエリで集計と非集計を使用する場合は、忘れないでくださいGROUP BY

    SELECT camera_id, ((avg(low_price) + avg(high_price)) / 2) as avg_price FROM camera_general
    INNER JOIN camera_products ON (camera_id = ir_camera_id)
    WHERE dp_post_dt IS NOT NULL
    AND dp_post_dt NOT LIKE '0000%'
    AND currently_manufactured = 'Yes'
    AND ((no_of_sellers >= 0) OR ((TO_DAYS(CURRENT_DATE) - TO_DAYS(dp_post_dt)) < 120))
    AND camera_id != 1411 AND camera_id != 9
    GROUP BY camera_id
    HAVING avg_price < 150
    ORDER BY rand();

于 2010-09-03T22:23:00.600 に答える
1

ORDER句は句の後に配置する必要がありHAVINGます。;(その後、セミコロンを付けてからORDER BY rand()続行しHAVINGます。これは、最初のクエリがで終了したため、実際には別のクエリの開始です;)。

于 2010-09-03T22:04:53.480 に答える