2017-12-17 16 views
0

にフィールドとして使用して:次の例では、WHERE句

SELECT op.product_id, op.name, IF(op.sku <> '', op.sku, op.model) AS op_sku, 
SUM(op.quantity) AS quantity 
FROM order_product op GROUP BY op_sku ORDER BY op_sku ASC LIMIT 0,50 

は、どのように私はWHERE句でop_skuを使用することができますか?私は必要な値を得るために別の選択肢を追加する必要がありますか?

EDIT元のクエリ:

SELECT op.product_id, 
     op.name, 
     IF(op.sku <> '', op.sku, op.model) AS model, 
     SUM(op.quantity)     AS quantity, 
     op.sku 
FROM `oc_product` p 
     RIGHT JOIN `oc_order_product` op 
       ON (p.product_id = op.product_id) 
     LEFT JOIN `oc_order` o 
       ON (op.order_id = o.order_id) 
WHERE o.order_status_id IN(17) 
GROUP BY op.sku 
ORDER BY op.sku ASC 
LIMIT 0, 50 
+0

何をしようとしていますか? 'select'の中に「裸の」列があるので、クエリは意味をなさない。 –

+0

skuですべての注文商品を取得しようとしていますが、スキューが存在しない場合はモデルが使用されます。実際のクエリはより複雑です。 – yoda

+0

元のクエリは_run_でも実行されますか? –

答えて

3

それはWHERE句が評価された時点ではまだ利用できないので、あなたは、同じクエリのWHERE句でSELECT句で定義された別名を使用することはできません。 1つのオプションは、ちょうどIF表現を繰り返して次のようになります。

SELECT 
    op.product_id, 
    op.name, 
    IF(op.sku <> '', op.sku, op.model) AS op_sku, 
    SUM(op.quantity) AS quantity 
FROM order_product op 
WHERE IF(op.sku <> '', op.sku, op.model) = <some_value> 
GROUP BY op_sku 
ORDER BY op_sku 
LIMIT 0,50 

この問題に対処するための別の一般的なオプションは、ちょうどあなたの現在のクエリをラップして、そこから選択することで。その場合には、別名が使用可能になります:op_skuによってグループ化しているときに非集計列を選択している場合

SELECT * 
FROM 
(
    SELECT 
     op.product_id, 
     op.name, 
     IF(op.sku <> '', op.sku, op.model) AS op_sku, 
     SUM(op.quantity) AS quantity 
    FROM order_product op 
    GROUP BY op_sku 
) t 
WHERE t.op_sku = <some_value> 
ORDER BY op_sku 
LIMIT 0, 50 

が他の人によって作られた一般的なコメントとして、あなたのクエリに問題がある可能性があります。理想的には、他の列は機能的にはop_skuまたはに依存する必要があります。これらは集約関数でラップする必要があります。しかし、私が与えた一般的な答えは、基本的な質問と同じ問題にもかかわらず、それほど有効ではありません。

+1

Common Table Expressionsを次のバージョンのMySQLに追加するだけで、これを処理するためのオプションが増えます。 –

+0

@BrianDewhirstはい、また、いくつかの基本的な解析機能が利用できると聞いています。 MySQLのすべての回答を編集する必要はありません。 –

+0

答えは正しいですが、最初のフレーズです。提供されたソリューションは機能しません。この場合、明らかに何も動作しません。 – yoda

2

あなたはそれはあなたの選択でのproduct_idと名エラーが原因を介しますが、これらは

SELECT op.product_id, op.name, IF(op.sku <> '', op.sku, op.model) AS op_sku, 
SUM(op.quantity) AS quantity 
FROM order_product op 
GROUP BY op_sku 
HAVING op_sku = @somevalue 
ORDER BY op_sku ASC 
LIMIT 0,50 

あなたのクエリが無効であるhaving句を介してアクセスすることができますwhere句でカスタムエイリアスを使用し、5.7のような新しいバージョンではできませんリストが無効です。これらをグループで追加するか、それらの値を取得するために集計関数を適用してください。