如何为订单及其项目编写自定义MySQL select查询

如何为订单及其项目编写自定义MySQL select查询,mysql,join,count,sum,having,Mysql,Join,Count,Sum,Having,我已经尽了最大努力,尽可能彻底地描述了我的问题;如果您有任何问题,请评论并提问。我意识到我可能错过了一个非常简单的解决方案,我很想听听我如何能让这个更简单;也就是说,请确保您的答案考虑了我描述的所有内容,并且在发布解决方案之前,您已经提出了所有问题(并收到了答案) 背景 两个表:订单和项目,每个表都包含唯一的信息(它们使用ID相互连接;无重复数据)。见附件A和B(下文) 订单表(附件A)包含该订单独有的所有信息。添加到订单中的每个项目在表中都有自己的行,其中包含订单ID、项目ID和数量(以及其他

我已经尽了最大努力,尽可能彻底地描述了我的问题;如果您有任何问题,请评论并提问。我意识到我可能错过了一个非常简单的解决方案,我很想听听我如何能让这个更简单;也就是说,请确保您的答案考虑了我描述的所有内容,并且在发布解决方案之前,您已经提出了所有问题(并收到了答案)

背景 两个表:
订单
项目
,每个表都包含唯一的信息(它们使用ID相互连接;无重复数据)。见附件A和B(下文)

订单
表(附件A)包含该订单独有的所有信息。添加到订单中的每个项目在表中都有自己的行,其中包含订单ID、项目ID和数量(以及其他不相关的字段)

问题 我正在构建一个界面,允许用户通过以下参数过滤订单:

  • 项目(产品)数量
  • 件数(产品数量)
  • 成本(订单总成本:产品数量乘以产品成本)
在我看来,在一个MySQL查询中收集所有数据应该是可能的。以下是我需要收集的信息:

  • 每个订单的项目数
  • 项目ID
  • 购买数量(每种产品)
例子 用户希望按照以下规格筛选所有订单:

  • 三项(产品)
  • 七件(总数量)
  • 不到600美元
如果所有数据(订单和项目)都包含在一个表中,则查询如下:

SELECT order_ID, 
       GROUP_CONCAT(item_ID) as item_IDs, 
       GROUP_CONCAT(quantity) as quantities, 
       SUM(price) as price 
FROM orders 
GROUP BY order_ID 
HAVING 7 = SUM(quantity) AND 
       3 = COUNT(*)
order_ID | item_IDs | quantities | price
=========================================
15       | 22,9,36  | 1,4,2      | $582
然后返回如下内容:

SELECT order_ID, 
       GROUP_CONCAT(item_ID) as item_IDs, 
       GROUP_CONCAT(quantity) as quantities, 
       SUM(price) as price 
FROM orders 
GROUP BY order_ID 
HAVING 7 = SUM(quantity) AND 
       3 = COUNT(*)
order_ID | item_IDs | quantities | price
=========================================
15       | 22,9,36  | 1,4,2      | $582
但由于价格存储在一个单独的表中,因此更为复杂。我创建了这个查询(见附件C):

这让我很接近,但留下我想要的定价信息。我尝试过使用
连接
(),但在几个小时后都无法让任何东西正常工作

问题 是否有可能在一个MySQL查询中检索所有这些数据,和/或是否有比我当前使用的路径更好的方法(您会怎么做)

允许查询返回类似以下内容的结果:

order_ID | item_ID | quantity | price
======================================
177      | 42      | 2        | 50.00
177      | 45      | 3        | 30.00
177      | 46      | 2        | 10.00
150      | 39      | 3        | 25.00
150      | 47      | 1        | 95.00
150      | 41      | 3        | 15.00
只要查询要求生成的订单包含三个项目和七个工件,并且总额少于600美元(根据提供的示例)

我也很无奈,这可能不可能在一个查询中实现,我知道如何使用PHP实现这一点;我想我可能会尝试在MySQL中尽可能多地使用它,并在今天学到一些东西。:)

你们中的一些人可能会建议更改表结构,但如果有帮助的话,我真的不希望有重复数据的表:如果产品价格发生变化,我不希望在两个表中进行更新

感谢您的时间和任何解决方案;我非常感谢你们所能提供的任何帮助

展品/视觉教具 附件A:
订单
表格 附件B:
项目
表 (提供完整信息,而非关键信息)

附件C:查询和结果

附件D:SQLFiddle
我将从这里开始,一步一步地完成

首先,LEFT JOIN是你的朋友。所以你可以得到每件商品的价格

示例1:

通过此查询,您可以从表orders中获得前100行,包括每行的价格

SELECT o.order_ID, 
       o.item_ID as item_ID,
       o.quantity as quantitie,
       i.price
FROM orders o
LEFT JOIN items i ON o.item_ID = i.id
ORDER BY o.order_ID
LIMI 100;
示例2:

现在,您的查询必须分成两部分。首先,我们将获得所有符合您标准的订单ID(项目、件数和价格)


我将从这里开始,一步一步地完成

首先,LEFT JOIN是你的朋友。所以你可以得到每件商品的价格

示例1:

通过此查询,您可以从表orders中获得前100行,包括每行的价格

SELECT o.order_ID, 
       o.item_ID as item_ID,
       o.quantity as quantitie,
       i.price
FROM orders o
LEFT JOIN items i ON o.item_ID = i.id
ORDER BY o.order_ID
LIMI 100;
示例2:

现在,您的查询必须分成两部分。首先,我们将获得所有符合您标准的订单ID(项目、件数和价格)


哇,反应快;非常感谢。我添加了一个SQLFIDLE作为附件D。从我所读到的内容来看,子查询并不是一个很好的性能选项。。。但是我猜,因为这就是你的答案,没有子查询就不可能得到首选的输出?我已经测试了示例3,输出对我来说似乎很好。您还可以使用一些左连接来执行此操作。我将做一个样本测试以及完整的数据库,输出似乎完美!非常感谢您的有效解决方案。我很好奇是否可以不使用子查询。@Caleb我在执行示例4时添加了示例4:MySQL错误#1248-每个派生表都必须有自己的别名哇,快速响应;非常感谢。我添加了一个SQLFIDLE作为附件D。从我所读到的内容来看,子查询并不是一个很好的性能选项。。。但是我猜,因为这就是你的答案,没有子查询就不可能得到首选的输出?我已经测试了示例3,输出对我来说似乎很好。您还可以使用一些左连接来执行此操作。我将做一个样本测试以及完整的数据库,输出似乎完美!非常感谢您的有效解决方案。我很想知道是否可以不使用子查询。@Caleb我在执行示例4时添加了示例4:MySQL错误#1248-每个派生表都必须有自己的别名
SELECT o.order_ID, 
       o.item_ID as item_ID,
       o.quantity as quantitie,
       i.price
FROM orders o
LEFT JOIN items i ON o.item_ID = i.id
ORDER BY o.order_ID
LIMI 100;
     SELECT o.order_ID
        FROM orders o
        LEFT JOIN items i ON o.item_ID = i.id
        GROUP BY o.order_ID
        HAVING
         SUM(o.`quantity`) =7 
       AND
         SUM(1) = 3
       AND
         SUM(i.price) < 700;
       ORDER BY o.order_ID;
SELECT o.order_ID, 
       o.item_ID as item_ID,
       o.quantity as quantitie,
       i.price
FROM orders o
LEFT JOIN items i ON o.item_ID = i.id
where o.order_ID IN (
    SELECT o.order_ID
    FROM orders o
    LEFT JOIN items i ON o.item_ID = i.id
    GROUP BY o.order_ID
    HAVING
     SUM(o.`quantity`) =7 
   AND
     SUM(1) = 3
   AND
     SUM(i.price) < 700    )
ORDER BY o.order_ID, o.quantity, i.price;
  SELECT mo.order_ID, 
        mo.item_ID ,
        mo.quantity,
        mi.price
   FROM (
        SELECT o.order_ID
        FROM orders o
        LEFT JOIN items i ON o.item_ID = i.id
        GROUP BY o.order_ID
        HAVING
         SUM(o.`quantity`) =7 
       AND
         SUM(1) = 3
       AND
         SUM(i.price) < 700 
    ) AS ord
    LEFT JOIN orders mo ON ord.order_ID = mo.order_ID
    LEFT JOIN items  mi ON mo.item_ID = mi.id
    ORDER BY ord.order_id, mo.quantity, mi.price;
+----------+---------+----------+--------+
| order_ID | item_ID | quantity | price  |
+----------+---------+----------+--------+
|      115 |      47 |        1 |  30.00 |
|      115 |      41 |        3 |  42.00 |
|      115 |      39 |        3 |  60.00 |
|      150 |      47 |        1 |  30.00 |
|      150 |      41 |        3 |  42.00 |
|      150 |      39 |        3 |  60.00 |
|      177 |      46 |        2 | 120.00 |
|      177 |      42 |        2 | 120.00 |
|      177 |      45 |        3 | 180.00 |
+----------+---------+----------+--------+
9 rows in set (0.06 sec)