2016-08-22 5 views
2

次のクエリを実行すると、データの欠落に関する問題が発生しています。 テーブルoc_product_specialには特別価格の商品があり、一部の商品にはテーブルoc_productに通常価格が格納されています。
テーブルoc_product_specialに特別価格がある場合にのみデータが表示されていることがわかりました。特別価格がなく、通常価格だけのデータは除外されています。この問題を解決する方法がわかりません。条件文などをどこに追加できるのかmysqlクエリにデータがありません。内部結合の条件文が必要です。

通常価格が存在し、特別価格がない場合は通常価格を表示し、特別価格は0を表示すると、どこにどこに追加できますか?

SELECT  
     pd.name AS 'Product Name', 
     p.model AS UPC, 
     p.quantity AS 'Quantity', 
     p.price AS 'Regular Price', 
     ps.price AS 'Special Price', 
     p.cost AS 'COST', 
     p.status AS 'Status' 
FROM oc_product p 
    INNER JOIN oc_product_description pd 
     ON pd.product_id = p.product_id 
    INNER JOIN oc_product_special ps 
     ON ps.product_id = p.product_id 
    INNER JOIN oc_manufacturer m 
     ON p.manufacturer_id = m.manufacturer_id 
    INNER JOIN oc_product_to_category p2c 
     ON p2c.product_id = p.product_id 
    INNER JOIN oc_category c 
     ON c.category_id = p2c.category_id 
    INNER JOIN oc_category_description cd 
     ON c.category_id = cd.category_id 
WHERE 
     c.category_id = 37 OR c.parent_id = 37 
GROUP BY pd.name ORDER BY m.name ASC 

答えて

1

に参加するので、..useが一致していません代右側のものと一致しない場合でも、結合の左側にレコードを保持します。

SELECT COALESCE(pd.name, 'NA') AS 'Product Name', 
     p.model AS UPC, 
     p.quantity AS 'Quantity', 
     p.price AS 'Regular Price', 
     COALESCE(ps.price, 0.0) AS 'Special Price', 
     p.cost AS 'COST', 
     p.status AS 'Status' 
FROM oc_product p 
LEFT JOIN oc_product_description pd 
    ON pd.product_id = p.product_id 
LEFT JOIN oc_product_special ps 
    ON ps.product_id = p.product_id 
INNER JOIN oc_manufacturer m 
    ON p.manufacturer_id = m.manufacturer_id 
INNER JOIN oc_product_to_category p2c 
    ON p2c.product_id = p.product_id 
INNER JOIN oc_category c 
    ON c.category_id = p2c.category_id 
INNER JOIN oc_category_description cd 
    ON c.category_id = cd.category_id 
WHERE c.category_id = 37 OR 
     c.parent_id = 37 
GROUP BY pd.name 
ORDER BY m.name 

説明:LEFT JOIN

、参加の左側にあるレコードが右側に何もない一致しない場合には、右サイドからの列はすべてとして表示されます結果セットのNULL私はクエリの中でCOALESCE関数を使用しました。条件付きで最初の引数を2番目の引数に置き換えます(前者がNULLの場合)。この場合、NULLの場合、特別価格はゼロに置き換えられます。場合によっては名前が欠落している場合は、製品名とともに使用しました。

+0

ありがとうございます。私は2つの非常に重要なことを学ばなければなりません.1つ目は左に参加し、もう1つはCOALESCEの機能です。この問題が修正されました。ありがとうございました。 –

0

使用はoc_product_special

SELECT  
      pd.name AS 'Product Name', 
      p.model AS UPC, 
      p.quantity AS 'Quantity', 
      p.price AS 'Regular Price', 
      ps.price AS 'Special Price', 
      p.cost AS 'COST', 
      p.status AS 'Status' 
    FROM oc_product p 
     INNER JOIN oc_product_description pd 
      ON pd.product_id = p.product_id 
     LEFT JOIN oc_product_special ps 
      ON ps.product_id = p.product_id 
     INNER JOIN oc_manufacturer m 
      ON p.manufacturer_id = m.manufacturer_id 
     INNER JOIN oc_product_to_category p2c 
      ON p2c.product_id = p.product_id 
     INNER JOIN oc_category c 
      ON c.category_id = p2c.category_id 
     INNER JOIN oc_category_description cd 
      ON c.category_id = cd.category_id 
    WHERE 
      c.category_id = 37 OR c.parent_id = 37 
    GROUP BY pd.name ORDER BY m.name ASC 

インナーに参加残さあなたの場合に値を一致させるためのSIに参加し、左使用LEFT JOIN

関連する問題