【问题标题】:when i joined the results in the parent table, it affects one item which it should not be affected当我在父表中加入结果时,它会影响它不应该受到影响的一项
【发布时间】:2014-03-19 17:08:17
【问题描述】:

我这里有这 3 张桌子:

 producttbl:
     p_id        p_name          price
    ANK001       ANKLET           200
    BRC001       BRACELET         100


    stocks_add:
     p_id          qty
    ANK001         200
    ANK001          50


    stocks_rel:
     p_id           qty
    ANK001           20

我在这里有这段代码(虽然我添加了一些代码,但@Bohemian 建议使用它):

 Select p.p_id, p.p_name, p.price,
`coalesce((SELECT sum(a.qty) 
    FROM stocks_add a GROUP BY a.p_id),0)
-coalesce((SELECT sum(r.qty)
    FROM stocks_rel r GROUP BY r.p_id),0)
 as stock_on_hand
from productstbl p
left join stocks_add a
on a.p_id=p.p_id
left join stocks_rel r
on r.p_id=p.p_id
GROUP BY p.p_id`

当我执行它时,结果如下:

p_id    p_name   price   stock_on_hand
ANK001  Anklet    200       230
BRC001  Bracelet  75        230

我正在尝试从第二张和第三张桌子上获取手头的库存。 并将其与产品表链接。

假设是,230应该只有ANK001。所需的输出应该是这个:

   `p_id    p_name   price   stock_on_hand
    ANK001  Anklet    200       230      
    BRC001  Bracelet  75         0  

 `

但是第一个输出的结果正好相反。 :( 代码有什么问题?请帮帮我。

【问题讨论】:

  • 最好创建一个重现问题的 sqlfiddle。对于我回答的每个 SQL 问题,我都必须这样做。此外,请在表的命名上保持一致 - 在读取查询时必须在 STOCKS_RELEASED 和 stocks_rel 之间进行转换不是很有用!
  • 我已经编辑了我犯的错误。当然。我会。我会尽力。 :)
  • 感谢您的修复 - 可以为我节省几分钟构建小提琴的时间(我必须在其中进行一些手动更改,但没什么大不了的)。 SQLFiddle 真的很不错,我建议你在合适的时候尝试一下 - 并确保使用完全震撼的“Text to DDL”按钮!

标签: mysql sql select left-join coalesce


【解决方案1】:

我不确定你的查询有什么问题,但我最容易写的方法如下:

select p.*, IFNULL(aqty,0) -  IFNULL(rqty,0) AS stock_on_hand
from productstbl p
left join (
   select p_id, SUM(IFNULL(a.qty,0)) as aqty 
  from stocks_add a
    group by p_id
  ) AS asum 
  on asum.p_id = p.p_id
  left join 
  (
    select p_id, SUM(IFNULL(r.qty,0)) as rqty
    from stocks_rel r 
    group by p_id
  ) AS rsum 
  on rsum.p_id = p.p_id;

并且它实际上给出了正确的结果!这对查询来说是一件好事:)

P_ID    P_NAME  PRICE   STOCK_ON_HAND
ANK001  ANKLET  200 230
BRC001  BRACELET    100 0

http://sqlfiddle.com/#!2/3c778/3

【讨论】:

  • 嗨@Dan Farell!是的,它确实给出了正确的结果。 :) 我很难考虑可能导致我的第一个输出错误的原因。无论如何,如果可以的话,我想使用您评论的代码。 :)
猜你喜欢
  • 2021-09-04
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
相关资源
最近更新 更多