2013-02-26 45 views
0

我有一個SQL查詢,我要查詢三個表(其中一些兩次)和我沒有得到結果,我需要:SQL查詢沒有顯示出需要的結果

我需要「文章」的搜索一個搜索字符串('網球')和查找這些文章的第二張'orderdetails'。 命中顯示訂購了多少。

現在我需要檢查這些項目是否已經交付。 因此,我查看'orderdetails'的表'訂單',並在同一個表中查找這些訂單是否有'delivery'。 '訂單'和'送貨'有一個字段,顯示它是什麼類型。

所以我必須檢查一個'交付'是否被一個'訂單'轉發。

接下來檢查這個'delivery'是否包含'article'並總結交付的文章。

如果交付物品的數量低於訂購物品的數量,我想顯示此記錄。

到目前爲止,它的工作原理除了這些項目: - [解決]感謝HLGEM「訂單」沒有「交貨」是不是在所有 顯示 - [解決]「訂單」與相同數量的「交貨」是顯示,但我不希望他們。

這是我到目前爲止有:

箴:流程訂單
珠三角:處理交貨
一個:ArticleItem
號碼:processOrderItem
d:deliveryItem

[更新代碼]

SELECT 
    a.Articlenumber AS Article, 
    PrO.Number AS Order, 
    PrD.Number AS Delivery, 
    p.Amount AS Orderamount, 
    SUM(d.Amount) AS Deliveryamount, 
    (p.Amount - Deliveryamount) AS OpenAmount 

FROM Article AS a 
    INNER JOIN ProcessesDetails AS p 
    ON (a.ArticleNumber = p.Article) 
     AND LEFT(p.Order, 3) = 'OR-' 
    INNER JOIN Processes as PrO 
    ON PrO.Number = p.Order 
     AND TEXTSEARCH('Delivery:' IN PrO.Forwarded) 
    LEFT JOIN Processes as PrD 
    ON PrO.Nummer = PrD.ForwardedFrom 
     AND LEFT(PrD.Number,3) = 'DE-' 
    INNER JOIN ProcessesDetails as d 
    ON PrD.Number = d.Order 
     AND d.Article = p.Article 
WHERE (a.Categorie = 'tennis') 
GROUP BY(Article) 

添加以下行解決了第二個問題:

HAVING Deliveryamount < Orderamount 
+1

什麼對查詢不起作用?請爲我們生成一個sql小提琴:sqlfiddle.com – Woot4Moo 2013-02-26 21:16:47

+0

我沒有看到數字比較行。是否應該用'''d.Article <> p.Article''''或類似的東西? – GSP 2013-02-26 21:27:07

+0

像上面最後一行GROUP? – Dinkheller 2013-02-26 22:04:44

回答

1
SELECT 
    a.Articlenumber AS Article,   
    PrO.Number AS Order, 
    PrD.Number AS Delivery,  
    p.Amount AS Orderamount,  
    SUM(d.Amount) AS Deliveryamount,  
    (p.Amount - Deliveryamount) AS OpenAmount  
FROM Article AS a  
    INNER JOIN ProcessesDetails AS p ON (a.ArticleNumber = p.Article) 
    INNER JOIN Processes as PrO ON PrO.Number = p.Order 
    LEFT JOIN Processes as PrD ON PrO.Nummer = PrD.ForwardedFrom AND LEFT(PrD.Number,3) = 'DE-' 
    INNER JOIN ProcessesDetails as d ON PrD.Number = d.Order 
WHERE (a.Categorie = 'tennis') 
AND LEFT(p.Order, 3) = 'OR-' 
AND TEXTSEARCH('Delivery:' IN PrO.Forwarded)AND d.Article = p.Article 
GROUP BY(Article) 

這將解決您的左連接問題。

+0

這是正確的方向。我得到我想要的一切,但它仍然顯示行如果SUM(s.Article)= p.Article。哪些不應該發生 – Dinkheller 2013-02-26 22:23:54

+0

我發現解決方案:添加'HAVING Orderamount> Deliveryamount'解決了問題已經devlivered這一切。 :) – Dinkheller 2013-02-26 22:39:27

+0

@HLGEM先生,是textsearch一個MySQL函數?我在谷歌找不到它,你能告訴我更多關於它嗎? – jcho360 2013-02-27 13:34:33

1

我不知道這是什麼線在WHERE條件:

AND TEXTSEARCH('Delivery:' IN PrO.Forwarded)

我不認爲textsearch功能在MySQL中存在,所以試試這個:

SELECT 
     a.Articlenumber AS Article,   
     PrO.Number AS Order, 
     PrD.Number AS Delivery,  
     p.Amount AS Orderamount,  
     SUM(d.Amount) AS Deliveryamount,  
     (p.Amount - Deliveryamount) AS OpenAmount  
    FROM Article AS a  
     INNER JOIN ProcessesDetails AS p ON (a.ArticleNumber = p.Article) 
     INNER JOIN Processes as PrO ON PrO.Number = p.Order 
     LEFT JOIN Processes as PrD ON PrO.Nummer = PrD.ForwardedFrom  
     INNER JOIN ProcessesDetails as d ON PrD.Number = d.Order 
    WHERE (a.Categorie = 'tennis') 
    AND LEFT(p.Order, 3) = 'OR-' 
    AND PrO.Forwarded like '%Delivery:%' 
    AND LEFT(PrD.Number,3) = 'DE-' 
    AND d.Article = p.Article 
    GROUP BY(Article) 

嘗試使用AND PrO.Forwarded like '%Delivery:%'代替AND TEXTSEARCH('Delivery:' IN PrO.Forwarded)

+0

它顯示相同的結果。但你是對的,這看起來更容易閱讀。感謝那一個。 我仍然有同樣的問題。 – Dinkheller 2013-02-26 21:44:04

0

第一個問題是可能與這兩條線:

LEFT JOIN Processes as PrD ON PrO.Nummer = PrD.ForwardedFrom 

AND LEFT(PrD.Number,3) = 'DE-' 

因爲左連接有效的具有NULL值,如果沒有發貨沒有辦法,珠三角。編號可以以'DE-'開頭。有可能是一個where子句,如:

AND (PrD.Number is null OR LEFT(PrD.Number,3) = 'DE-') 

可能解決您的問題的第一部分。不確定問題的第二部分。我無法弄清楚你在做數字比較。

+0

這隻會改變一些東西,如果我要改變整個區塊: AND(TEXTSEARCH('Delivery:'IN Pr.For.Forward)或 (LEFT(PrD.Number,3)='DE-' AND d.Article = p.Article) ) 但後來我收到了交付物品總數的錯誤號碼。 – Dinkheller 2013-02-26 21:39:08