2017-06-23 18 views
0

私はmysql where節で少し問題に直面しています。 これはクエリです:mysqlの結果は "where"節

エラーコード:1054

SELECT u.id user 
    , p.id product_purchased 
    , p.name product_name 
    , pl.store_id store 
    , COUNT(*) occurrences 
    , total_spent 
    , total_product_purchased 
    , pl.registration 
    FROM purchases_log pl 
    JOIN user u 
    ON pl.user_id = u.id 
    JOIN product p 
    ON pl.product_id = p.id 
    JOIN 
    (SELECT user_id 
      , SUM(price) total_spent 
      , COUNT(product_id) total_product_purchased 
     FROM purchases_log pl 
     GROUP 
      BY user_id 
    ) t1 
    ON u.id = t1.user_id 
WHERE pl.store_id IN (1,2,3) 
    AND occurrences > 1 
GROUP 
    BY user 
    , product_name 
ORDER 
    BY u.id ASC 
    , pl.registration ASC; 

これは、出力エラーです。 'where句'内の 'occurrences'列が不明です

私は既にASを出現またはplに割り当てようとしました。 だから、どこの句でカウント関数の結果を正しく定義するか教えてくれますか?

答えて

2

あなたはWHERE句ので、後に適用されることにより、グループとしてHAVINGの代わりCOUNTを使用する必要があり、それがどのグループ/集計列、例えば/について知ることができません。

SELECT u.id user,p.id product_purchased, p.name product_name, pl.store_id store, COUNT(*) AS occurrences, total_spent, total_product_purchased, pl.registration 
FROM purchases_log pl 
JOIN user u ON pl.user_id=u.id 
JOIN product p ON pl.product_id=p.id 
JOIN (SELECT user_id, SUM(price) AS total_spent,COUNT(product_id) AS total_product_purchased FROM purchases_log pl GROUP BY user_id) t1 ON u.id=t1.user_id 
WHERE pl.store_id IN (1,2,3) 
GROUP BY user, product_name 
HAVING COUNT(*) > 1 
ORDER BY u.id ASC, pl.registration ASC; 

更新

  • ユーザーに複数の製品が関連付けられている場合は、GROUP BYにすべての非集約列を追加して、ユーザーと製品のすべての組み合わせを取得することをお勧めします。現在のクエリは、すべての組み合わせを返しません。
  • @strawberryが示唆しているように、さらに最適化するには、EXPLAINを実行して、使用されているインデックスと新しいインデックスを作成する必要があるかどうかを確認できます。
+0

ありがとうございます、それは魅力的です! – UgoL

+1

@UgoLあなたが助けてくれれば回答を受け入れることができます。 –

+0

ええ、私はそれを受け入れるために10分待つ必要があります。私はクエリの構造が良く見えるかどうか尋ねたいと思います。それを最適化する方法はありますか? – UgoL