如何为订单及其项目编写自定义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和数量(以及其他不相关的字段)
问题
我正在构建一个界面,允许用户通过以下参数过滤订单:
- 项目(产品)数量
- 件数(产品数量)
- 成本(订单总成本:产品数量乘以产品成本)
- 每个订单的项目数
- 项目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)