2012-09-19 35 views
1

我有3个表内使用条件:MySQL的 - 从选择

  • 订单:
    • orders_id
    • date_purchased
    • ...
  • orders_products:
    • orders_products_id
    • orders_id
    • products_id
    • products_name
    • products_quantity
    • ...
  • products_warehouses:
    • products_id
    • warehouses_id
    • product_quantity_in_warehouse

现在我想用下面信息的表格:

  • CURRENT_DATE
  • products_id
  • products_name
  • warehouses_id
  • current_quantity_in_warehouse
  • 溶胶d_yesterday

我已经走到这一步了以下内容:

SELECT DISTINCT CURRENT_DATE AS `date` 
       orpr.products_id AS products_id 
       orpr.products_name AS products_name 
       pwq.warehouses_id AS warehouses_id 
       pwq.products_quantity AS current_quantity_in_warehouse 
       ( SELECT SUM(orpr.products_quantity) 
        FROM `products_warehouses` wpq 
        INNER JOIN `orders_products` orpr ON pwq.products_id = orpr.products_id 
        INNER JOIN `orders` or ON orpr.orders_id = or.orders_id 
        WHERE pwq.products_id = ?? 
        AND pwq.warehouses_id = ??) AS sold_yeserday 
FROM    `orders_products` orpr 
INNER JOIN  `orders` or ON orpr.orders_id = or.orders_id 
INNER JOIN  `products_warehouses pwq ON pwq.products_id = orpr.products_id; 

我要的是在??的的products_id的地方,warehouses_id simular到结果的每一行。

如果有人得到了一个更容易exmaple如何使用选择内select(内部选择使用where-condition id从选择其中,这会改变每一行当然),这也很好,作为只要我能重现这个例子来解决我的问题。

由于提前,

格尔茨, 凯文ç

+1

这听起来像一个相关的子查询,它有一些性能问题。将它转换为一个连接可能会更容易:'JOIN(SELECT products_id,warehouses_id,SUM(products_quantity)GROUP BY products_id,warehouses_id)'。 – DCoder

+0

我们可否预览您的预期输出的一些虚拟数据?并且如果可能,请在[sqlfiddle](http://sqlfiddle.com/)上显示当前进度的示例谢谢 – Killrawr

+0

http://ideone.com/5sb68由于SQL-fiddle只允许8000个或更少的字符,因此我将插入内容发布到ideone上.COM。我为我的问题删除了所有不需要的数据,并且由于隐私原因更换了产品名称。 (16206和2应该用该行的当前ID替换)。 –

回答

0

你应该提取内部SELECT语句,把reult在一个表中,你可以在你的外表是表的连接选择

SELECT SUM(orpr.products_quantity) As 'Sold_yesterday', pwd.products_id, pwd.warehouses_id 
INTO #tempTable 
FROM `products_warehouses` wpq 
INNER JOIN `orders_products` orpr ON pwq.products_id = orpr.products_id 
INNER JOIN `orders` or ON orpr.orders_id = or.orders_id 


SELECT DISTINCT CURRENT_DATE AS `date` 
orpr.products_id AS products_id 
orpr.products_name AS products_name 
pwq.warehouses_id AS warehouses_id 
pwq.products_quantity AS current_quantity_in_warehouse     
FROM    `orders_products` orpr 
INNER JOIN  `orders` or ON orpr.orders_id = or.orders_id 
INNER JOIN  `products_warehouses pwq ON pwq.products_id = orpr.products_id; 
INNER JOIN  '#tempTable' tt On tt.products_id = pwd.products_id AND tt.warehouses_id = pwd.warehouses_id 
+0

我尝试了你的解决方案,但它在#tempTable部分给了我一个错误。 –

0
SELECT 
    CURRENT_DATE AS `date`, 
    orpr.products_id AS products_id, 
    orpr.products_name AS products_name, 
    pwq.warehouses_id AS warehouses_id, 
    pwq.products_quantity AS current_quantity_in_warehouse, 
    SUM(orpr.products_quantity) AS sold_yeserday 
FROM    
    orders_products orpr 
    INNER JOIN  
    products_warehouses pwq ON pwq.products_id = orpr.products_id; 
group by orpr.products_id, pwq.warehouses_id 
order by orpr.products_id, pwq.warehouses_id