2011-04-13 115 views
1

我有下面的查詢返回產品和最低的賣出價格與銷售價格的數量。一切工作都很完美,直到我想要在product_price表中找不到任何價格的產品。我怎樣才能讓它返回產品數據和NULLS售價和數量?連接SQL查詢問題

SELECT p.*, MIN(pp.sellPrice) as sellPrice, pp.quantity FROM `product` as p 
LEFT JOIN `product_price_group` as ppg ON ppg.productId = p.`id` 
LEFT JOIN `product_price` as pp ON pp.priceGroupId = ppg.`id` 
WHERE p.`id` = 1 AND p.`active` = 1 

輸出有一個可用的價格的產品:一個產品的

+----+--------------+--------+--------------+--------------+-----------+----------+ 
| id | name   | active | sortSequence | creationDate | sellPrice | quantity | 
+----+--------------+--------+--------------+--------------+-----------+----------+ 
| 1 | product_id_1 |  1 |   1 | 1287481220 |  22.00 |  10 | 
+----+--------------+--------+--------------+--------------+-----------+----------+ 

輸出沒有avaialble定價

+----+------+--------+--------------+--------------+-----------+----------+ 
| id | name | active | sortSequence | creationDate | sellPrice | quantity | 
+----+------+--------+--------------+--------------+-----------+----------+ 
| NULL | NULL | NULL |   NULL |   NULL |  NULL |  NULL | 
+----+------+--------+--------------+--------------+-----------+----------+ 

所需的輸出:

+----+--------------+--------+--------------+--------------+-----------+----------+ 
| id | name   | active | sortSequence | creationDate | sellPrice | quantity | 
+----+--------------+--------+--------------+--------------+-----------+----------+ 
| 2 | product_id_2 |  1 |   1 | 1287481220 |  NULL |  NULL | 
+----+--------------+--------+--------------+--------------+-----------+----------+ 

更新 看來,我選擇上不存在的產品項目!非常愚蠢。

+0

MySQL *和* TSQL標籤?我的意思是,你沒有「GROUP BY」子句,所以它是MySQL,但是你必須用TSQL標記它嗎? – 2011-04-13 11:01:28

+0

在桌子上出現了一些光學錯覺。對任何人來說,這些線條看起來都很彎曲? ; -D – 2011-04-13 11:03:29

+0

我爲MySql中的表和數據創建了一個最小模式的最佳猜測版本,當我執行查詢時,我得到了我期望的(以及你希望看到的),所以顯然我做了一個不正確的猜測一個或多個表(或其中的數據)的適當模式。您能否提供關於您正在查看的架構,關係廣告數據的一些指導? – cori 2011-04-14 04:19:36

回答

0

如何在product_price表中使用LEFT OUTER JOIN?

SELECT p.*, MIN(pp.sellPrice) as sellPrice, pp.quantity FROM `product` as p 
LEFT JOIN `product_price_group` as ppg ON ppg.productId = p.`id` 
LEFT OUTER JOIN `product_price` as pp ON pp.priceGroupId = ppg.`id` 
WHERE p.`id` = 1 AND p.`active` = 1 

這是你想要的嗎?

UPDATE:修改 - 像其他人說,LEFT JOIN = LEFT (OUTER) JOIN所以它不會幫助你在這種情況下...

+0

我相信OUTER是可選的 - LEFT JOIN假定爲OUTER。 – cori 2011-04-13 11:04:04

+0

同意。 LEFT OUTER JOIN =左連接,INNER JOIN =連接 – heximal 2011-04-13 11:05:56

0

我可能是不正確的,但我的左派的理解JOIN一直在平等的表引用測試寫在SQL語句中...另外,我如何編寫查詢...從我期望的FIRST(左)開始,加入到其他(右)表中第二個...保持連接狀態還各自這種關係......

select from x left join y where x.fld = y.fld 
    instead of 
select from x left join y where y.fld = x.fld 

所以我會如下

調整查詢
SELECT 
     p.*, 
     MIN(pp.sellPrice) as sellPrice, 
     pp.quantity 
    FROM 
     product as p 
     LEFT JOIN product_price_group as ppg 
      ON p.id = ppg.productId 
      LEFT JOIN product_price as pp 
       ON ppg.id = pp.priceGroupId 
    WHERE 
      p.id = 1 
     AND p.active = 1 

另外,您可以用IFNULL(field,0)來包裝您的min()和數量,以防止顯示NULLS,但實際上具有零值。

+0

不幸的是,它沒有區別 – tom 2011-04-13 11:57:15