1

MySQL SELECTステートメントにサブクエリを含めて、そのリンクに関連付けられている製品IDが存在しなくなったときに製品リンクをアセンブルしようとしています。その製品IDが存在しない場合、サブクエリは結果を検出せず、行全体が最終結果から省略されます。とにかく行を返したいのですが(NULLで結構です)。

SELECT s.field_a, s.field_b, s.field_c,
    (SELECT CONCAT( '/', sma.name_link, '/', smo.name_link, '.html?pid=', spr.id )
        FROM sales_products AS spr, sales_sections AS see,
            sales_models AS smo, sales_manufacturers AS sma
        WHERE sse.id = spr.sales_section_id AND smo.id = sse.sales_model_id
            AND smo.sales_manufacturer_id = sma.id
            AND spr.id = s.sales_product_id
    ) AS product_link
    FROM sales_order_items AS s, sales_products AS p
    WHERE s.order_id = 100 AND p.id = s.sales_product_id
    ORDER BY shipment_id, sales_order_item_id

私はかなり長い間検索しましたが、私はこれをつなぎ合わせることができていません。どんな種類のフィードバックや解決策も提供できることを楽しみにしています。

4

2 に答える 2

0

product_idクエリのどこにも列参照が表示されないので、列がsales_product テーブルsales_product_idの値と一致しない値を持つ列であることを意味していると仮定します。id

「欠落している行」の問題は、SELECT リストのサブクエリと関係があるとは思いません。sales_product テーブルへの INNER JOIN に関係していると思います。これを LEFT OUTER JOIN に変更することをお勧めします。

SELECT s.field_a
     , s.field_b
     , s.field_c
     , (SELECT CONCAT('/',sma.name_link,'/',smo.name_link,'.html?pid=',spr.id)
          FROM sales_products spr
          JOIN sales_sections see ON sse.id = spr.sales_section_id
          JOIN sales_models smo ON smo.id = sse.sales_model_id
          JOIN sales_manufacturers sma ON sma.id = smo.sales_manufacturer_id 
         WHERE spr.id = s.sales_product_id
         ORDER BY 1 LIMIT 1
       ) AS product_link
  FROM sales_order_items s
  LEFT
  JOIN sales_products p ON p.id = s.sales_product_id
 WHERE s.order_id = 100
 ORDER BY shipment_id, sales_order_item_id

注: SELECT リスト (product_link としてエイリアス化) 内のそのサブクエリの問題は、そのサブクエリが複数の行を返す場合 (いつ?)、ステートメントが例外をスローすることです。それが決して行われないという何らかの保証がない限り、少なくとも、ORDER BY 1 LIMIT 1 を平手打ちするか、CONCAT の周りに MAX 集約を平手打ちすることができます (決定論的であるように)。

潜在的な「あいまいな列」例外に対する保護として、ORDER BY 句の列参照をテーブル エイリアスで修飾することも非常に良い考えです。すべての列参照が修飾されていることがわかりました。これは非常に良いことです。

また、元のクエリを再フォーマットし、(コンマの代わりに) JOIN キーワードを導入し、結合述語を WHERE 句から ON 句に移動したことにもお気づきでしょう。これにより、ステートメントが非常に読みやすくなり、デバッグがはるかに簡単になることがわかりました。また、OUTER JOIN を指定することもできます。

于 2012-06-21T20:46:33.187 に答える
-1

クエリで UNION を使用してみるか、値が空の場合は IF sql 条件を使用して NULL を設定することもできます。

それが役立つことを願っています。

于 2012-06-21T18:41:03.070 に答える