2015-08-22 9 views
0

我有一個連接和子查詢(派生表)的查詢。如果我運行它沒有限制1,結果將包含增值稅和ID字段與正確的值。MySQL的左連接子查詢的限制給父母選擇空值的字段

第一個查詢:

SELECT i.id, i.vat, pl.invoice_id as inv_id, pl.product_id as pl_id, pl.quantity as qty, pl.price, pl.currency, p.name, p.manufacturer, p.list_price, p.cost_price, p.wholesale_price, p.cikkszam, p.unit, p.group_name 
FROM soulnsoda_products_log pl 
LEFT JOIN soulnsoda_products p ON pl.product_id=p.id 
LEFT JOIN (select id, vat, parent_id, beneficiary_account from soulnsoda_invoices) as i ON i.parent_id>0 AND pl.invoice_id=i.parent_id AND pl.product_id=i.beneficiary_account 
WHERE pl.action=6 AND p.cikkszam = 'S6511415-BLK' AND (pl.stamp BETWEEN '2015-08-15 00:00:00' AND '2015-08-15 23:59:59') AND pl.warehouse_name='Garage - Árkád' 
ORDER BY p.cikkszam 

結果將包含值的i.id和i.vat領域,但複製行:

id  vat  inv_id pl_id qty  price  name     
93119 27.00 93117 21961 -1.00 1096.85 HUF SUPRA ICON SX BLACK DB 
93120 27.00 93117 21961 -1.00 1096.85 HUF SUPRA ICON SX BLACK DB 
93119 27.00 93117 21961 -1.00 1096.85 HUF SUPRA ICON SX BLACK DB 
93120 27.00 93117 21961 -1.00 1096.85 HUF SUPRA ICON SX BLACK DB 

我不得不過濾掉重複的行IDS。當我使用LIMIT 1時,重複將消失,但id和vat字段將爲NULL。我不知道爲什麼...

與限制第二查詢:

SELECT i.id, i.vat, pl.invoice_id as inv_id, pl.product_id as pl_id, pl.quantity as qty, pl.price, pl.currency, p.name, p.manufacturer, p.list_price, p.cost_price, p.wholesale_price, p.cikkszam, p.unit, p.group_name 
FROM soulnsoda_products_log pl 
LEFT JOIN soulnsoda_products p ON pl.product_id=p.id 
LEFT JOIN (select id, vat, parent_id, beneficiary_account from soulnsoda_invoices LIMIT 1) as i ON i.parent_id>0 AND pl.invoice_id=i.parent_id AND pl.product_id=i.beneficiary_account 
WHERE pl.action=6 AND p.cikkszam = 'S6511415-BLK' AND (pl.stamp BETWEEN '2015-08-15 00:00:00' AND '2015-08-15 23:59:59') AND pl.warehouse_name='Garage - Árkád' 
ORDER BY p.cikkszam 

其結果將是兩行是行,但沒有編號和增值稅:

id  vat  inv_id pl_id qty  price  name     
NULL NULL 93117 21961 -1.00 1096.85 HUF SUPRA ICON SX BLACK DB 
NULL NULL 93117 21961 -1.00 1096.85 HUF SUPRA ICON SX BLACK DB 

我試過LIMIT 1,GROUP BY,MIN,MAX等。

我知道DISTINCT正在處理我的示例,但它是一個簡化的查詢來向您顯示問題本身。

我怎樣才能實現只有兩行的結果,但在id和增值列中的值,使用一些技術在(或左右)LEFT JOIN子查詢?

+0

null在右表不是左邊的一個。所以使用'是空'或'不爲空' – Drew

+0

謝謝,但遺憾的是,結果爲空。所以我無法處理。 – Tamas

回答

0

如果你的問題是重複的行,然後使用select distinct。其實,這將是更好的找到重複的原因,但是這可能是你想要什麼:

SELECT distinct i.id, i.vat, pl.invoice_id as inv_id, pl.product_id as pl_id, 
     pl.quantity as qty, pl.price, pl.currency, p.name, p.manufacturer, 
     p.list_price, p.cost_price, p.wholesale_price, p.cikkszam, p.unit, p.group_name 
FROM soulnsoda_products_log pl LEFT JOIN 
    soulnsoda_products p 
    ON pl.product_id = p.id LEFT JOIN 
    soulnsoda_invoices i 
    ON i.parent_id > 0 AND pl.invoice_id = i.parent_id AND 
     pl.product_id = i.beneficiary_account 
WHERE pl.action = 6 AND 
     p.cikkszam = 'S6511415-BLK' AND 
     pl.stamp >= '2015-08-15' AND pl.stamp < '2015-08-16' AND  
     pl.warehouse_name = 'Garage - Árkád' 
ORDER BY p.cikkszam 

一些注意事項:

  • pleft join正在變成一個內通過加盟where條款。
  • 子查詢不是必需的,事實上,只會傷害性能。
  • 該版本簡化了日期比較。
+0

我以這種方式嘗試了獨特的,但正如我試圖解釋它,我不得不處理子查詢,因爲它是簡化版本,以瞭解我的問題。在活動查詢中,在父SELECT中有一些SUM。所以處理內部select中只有兩行非常重要。但是,謝謝你的努力! – Tamas

0

在您的第一個查詢中,子句WHERE ... p.cikkszam = 'S6511415-BLK'將您的第一個LEFT JOIN轉換爲普通的內部JOIN。

ORDER BY p.cikkszam子句與WHERE ... p.cikkszam = 'S6511415-BLK'結合使用時不會執行任何操作:在結果集的該列中只有一個值。

您的時間戳結束間隔匹配有點笨拙,幾乎是正確的。試試這個,這將是完美的。

  pl.stamp >= '2015-08-15' 
    AND pl.stamp < '2015-08-15' + INTERVAL 1 DAY 

在你的第二個查詢此子查詢子句只允許一個,隨機選擇的,發票行被連接到您的查詢的其餘部分:

select id, vat, parent_id, beneficiary_account from soulnsoda_invoices LIMIT 1 

此採發票的「第一」行表。麻煩的是,沒有ORDER BY MySQL和其他RDMS引擎沒有「第一」的固定概念。所以你的第二個查詢是不正確的。

您的查詢似乎要求某個產品('S6511415-BLK')每個發票在某一天從某個倉庫發貨(action=6)。數據中的發票表中有兩個匹配的行。其他表格中還有兩個匹配的行。或者,您的發票表格中可能有四個匹配的行。

您還沒有向我們描述您的表格的內容。因此,我們很難幫助您找出重複行的位置。如果您願意,您可以使用SELECT DISTINCT消除發票表中的泡泡。

下面是我建議的查詢。這會給你一個兩行結果集。

SELECT i.id, i.vat, 
     pl.invoice_id as inv_id, pl.product_id as pl_id, pl.quantity as qty, 
     pl.price, pl.currency, 
     p.name, p.manufacturer, p.list_price, p.cost_price, 
     p.wholesale_price, p.cikkszam, p.unit, p.group_name 
    FROM soulnsoda_products_log pl 
    JOIN soulnsoda_products p ON pl.product_id=p.id 
    LEFT JOIN (SELECT DISTINCT id, vat, 
          parent_id, beneficiary_account 
         FROM soulnsoda_invoices 
      ) as i ON i.parent_id > 0 
        AND pl.invoice_id = i.parent_id 
        AND pl.product_id = i.beneficiary_account  
WHERE pl.action=6 
    AND p.cikkszam = 'S6511415-BLK' 
    AND pl.stamp >= '2015-08-15' 
    AND pl.stamp < '2015-08-15' + INTERVAL 1 DAY 
    AND pl.warehouse_name='Garage - Árkád' 
ORDER BY p.cikkszam, i.id 
+0

謝謝Ollie。由於沒有解釋結構,我知道很難找出正確的方法。如果我運行你的選擇,我有4行。主要問題是發票上有兩個項目在不同的行中。因此,invoice_id是相同的,product_id是相同的,只是發票項目行的id(它是invoces表中的id本身)是不同的。在這種情況下,當我使用invoiced_id和paroduct_id加入發票和products_log表時,我有四行。由於有兩個匹配的行,它將被複制... – Tamas