【问题标题】:MySQL - Using condition from inside a selectMySQL - 在选择中使用条件
【发布时间】:2012-09-11 16:57:51
【问题描述】:

我有 3 张桌子:

  • 订单:
    • orders_id
    • 购买日期
    • ...
  • orders_products:
    • orders_products_id
    • orders_id
    • products_id
    • 产品名称
    • products_quantity
    • ...
  • products_warehouses:
    • products_id
    • warehouses_id
    • product_quantity_in_warehouse

现在我想要一个包含以下信息的表格:

  • 当前日期
  • products_id
  • 产品名称
  • warehouses_id
  • current_quantity_in_warehouse
  • 昨天售出

到目前为止,我得到了以下内容:

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 与结果的每一行类似。

如果有人有一个更简单的例子来说明如何在选择中使用选择(内部选择使用其中的选择条件 ID,当然这会改变每一行),它也很好,只要因为我可以重现该示例来解决我的问题。

提前致谢,

问候, 凯文C

【问题讨论】:

  • 这听起来像是一个相关的子查询,它有一些性能问题。将其转换为针对此聚合的连接可能更容易:JOIN (SELECT products_id, warehouses_id, SUM(products_quantity) GROUP BY products_id, warehouses_id)
  • 您能预览一下您预期输出的一些虚拟数据吗?如果可能的话,请提供您在sqlfiddle 上的当前进度示例,谢谢
  • ideone.com/5sb68 由于 SQL-fiddle 只允许 8000 个或更少的字符,我在 ideone.com 上发布了插入。由于隐私原因,我删除了所有不需要的数据,并替换了产品名称。 (应将 16206 和 2 替换为该行的当前 ID)。

标签: mysql select parameters conditional-statements


【解决方案1】:

您应该提取内部 SELECT 语句并将结果放入表中,然后您可以在外部选择中加入该表

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

【讨论】:

  • 我尝试了您的解决方案,但在#tempTable 部分出现错误。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2015-11-16
    相关资源
    最近更新 更多