0

以下のクエリでは、左外部結合の最初のテーブルを使用しようとしています。ただし、エラーが発生します。

SELECT
       products.id,
       products_cstm.oem_c,
       products.mfr_part_num,
       products.description,
       products.cost,
       products.assigned_user_id,
       customfields_oo.ans
FROM products
          LEFT OUTER JOIN (SELECT  COUNT( q.id )  AS ans
                                  , pq.product_id
                           FROM   products_quotes pq 
                                     LEFT JOIN quotes q
                                           ON pq.quote_id = q.id
                           WHERE  q.deleted = 0
                           AND    pq.deleted = 0
                           AND    q.stage <> 4
                           AND  (pq.qty_shipped < pq.product_qty)
                           AND  pq.product_id = products.id
                           GROUP BY pq.product_id
                      ) AS customfields_oo
                ON customfields_oo.product_id = products.id
          LEFT JOIN products_cstm
                ON products.id = products_cstm.id_c
WHERE  products.deleted = 0
ORDER  BY ans DESC

クエリを実行すると、次のエラーが発生します。

Error Code : 1054
Unknown column 'products.id' in 'where clause'

左外部結合クエリで最初の「製品」テーブルを許可していません。

4

2 に答える 2

1

AND pq.product_id = products.idwhereステートメントに含める必要はありません。あなたがそれにLEFT JOIN取り組んでいるからです。だから私はこのようなものがうまくいくと思います:

AND (pq.qty_shipped < pq.product_qty)
GROUP BY pq.product_id) AS customfields_oo
ON customfields_oo.product_id = products.id
LEFT JOIN products_cstm
   ON products.id = products_cstm.id_c
WHERE products.deleted = 0
ORDER BY openorder DESC

編集

LEFT JOINあなたはあなたがしているテーブルの上にいる必要はありませんCOUNT。次のようにすることもできます。

SELECT
    .....
    (
        SELECT
           COUNT( q.id )
        FROM products_quotes pq
        LEFT JOIN quotes q
           ON pq.quote_id = q.id
        WHERE q.deleted = 0
        AND pq.deleted = 0
        AND q.stage <> 4
        AND (pq.qty_shipped < pq.product_qty)
        AND pq.product_id = products.id
    ) AS ans
 FROM products
 .....
于 2012-05-02T08:36:35.660 に答える
1

問題はcustomfields_oo、相関サブクエリではなく派生テーブルであるということです。したがって、派生テーブルの定義内から外部テーブルを参照することはできません。この場合、定義products内から外部テーブルを参照することはできません。代わりに、派生テーブル定義の外側の句でcustomfields_ooそのフィルターを実行する必要があります。On

Select products.id,
       products_cstm.oem_c,
       products.mfr_part_num,
       products.description,
       products.cost,
       products.assigned_user_id,
       customfields_oo.ans
FROM products
    Left Join   (
                Select pq1.product_id
                    , Count( q1.id ) As ans
                From products_quotes As pq1 
                    Left Join quotes As q1
                        On pq1.quote_id = q1.id
                Where q1.deleted = 0
                    And pq1.deleted = 0
                    And q1.stage <> 4
                    And pq1.qty_shipped < pq1.product_qty
                Group By pq1.product_id
                ) As customfields_oo
        On customfields_oo.product_id = products.id
    Left Join products_cstm
        On products.id = products_cstm.id_c
Where products.deleted = 0
Order By customfields_oo.ans Desc

さて、コメントで、これは遅すぎると述べました。たとえば、削除された<>0の製品が派生テーブルで評価される可能性があるためです。その場合は、派生テーブルを展開して、外側のproductsテーブルにフィルターを含めます。

Select products.id,
       products_cstm.oem_c,
       products.mfr_part_num,
       products.description,
       products.cost,
       products.assigned_user_id,
       customfields_oo.ans
FROM products
    Left Join   (
                Select pq1.product_id
                    , Count( q1.id ) As ans
                From products_quotes As pq1 
                    Join products As p1
                        On p1.products.id = pq1.product_id
                    Left Join quotes As q1
                        On pq1.quote_id = q1.id
                Where q1.deleted = 0
                    And pq1.deleted = 0
                    And q1.stage <> 4
                    And pq1.qty_shipped < pq1.product_qty
                    And p1.deleted = 0
                Group By pq1.product_id
                ) As customfields_oo
        On customfields_oo.product_id = products.id
    Left Join products_cstm
        On products.id = products_cstm.id_c
Where products.deleted = 0
Order By customfields_oo.ans Desc
于 2012-05-03T02:19:14.247 に答える