2013-02-26 53 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