0

3 つのテーブル (一部は 2 回) をクエリする必要がある SQL クエリがあり、必要な結果が得られません。

「articles」で検索文字列 (「tennis」) を検索し、これらの記事の 2 番目のテーブル「orderdetails」を検索する必要があります。ヒット数は、注文された金額を示します。

次に、これらの商品がすでに配達されているかどうかを確認する必要があります。そこで、「orderdetails」のテーブル「orders」を検索し、これらの注文に「delivery」があるかどうかを同じテーブルで調べます。「注文」と「配送」には、その種類を示すフィールドがあります。

したがって、「配送」が「注文」によって転送されたかどうかを確認する必要があります。

次に、この「配信」に「記事」が含まれているかどうかを確認し、配信された記事を合計します。

納品数が注文数よりも少ない場合は、このレコードを表示したい。

これまでのところ、これらのアイテム以外にも機能します: - [解決済み] HLGEM のおかげで、「配送」のない「注文」はまったく表示されません - [解決済み] 「配送」と同じ金額の「注文」は表示されますが、表示されません彼らに望んでいます。

これが私がこれまでに持っているものです:

PrO:注文の処理
PrD: 配送の処理
a: ArticleItem
p: 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)

次の行を追加すると、2番目の問題が解決しました。

HAVING Deliveryamount < Orderamount
4

3 に答える 3

1

where条件のこの行が何であるかわかりません:

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

その関数がmysqlに存在するとは思わないtextsearchので、これを試してください:

 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)

于 2013-02-26T21:26:32.347 に答える
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)

これにより、左結合の問題が修正されます。

于 2013-02-26T21:42:16.843 に答える
0

最初の問題は、次の 2 行に関連している可能性があります。

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

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

配信がない場合、左側の結合は事実上 NULL 値を持つため、PrD.Number を「DE-」で開始することはできません。where 句が次のようになる可能性があります。

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

あなたの質問の最初の部分を解決するかもしれません。質問の2番目の部分についてはわかりません。数値比較をどこで行っているのかわかりません。

于 2013-02-26T21:29:13.650 に答える