【发布时间】:2015-10-26 21:30:47
【问题描述】:
我已尽我所能详细描述我的问题;如果您有任何问题,请发表评论并询问。我知道我可能错过了一个非常简单的解决方案,并且很想听听我怎样才能使它变得更简单;也就是说,请确保您的答案考虑了我所描述的所有内容,并且在发布您的解决方案之前,您已经提出了所有问题(并收到了答案)。
背景
两个表:orders 和 items,每个表都包含唯一信息(它们使用 ID 相互连接;没有重复数据)。见附件 A 和 B(下)。
orders 表(附件 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
但由于价格存储在单独的表中,所以比较复杂。我创建了这个查询(参见图表 C):
SELECT DISTINCT o.order_ID,
GROUP_CONCAT(o.`item_ID`) as item_IDs,
GROUP_CONCAT(o.`quantity`) as quantities
FROM orders o
GROUP BY o.`order_ID`
HAVING 7 = SUM(o.`quantity`) AND
3 = COUNT(*)
ORDER BY o.`order_ID` DESC`
这让我很接近,但让我想要定价信息。我尝试过使用JOINS (What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?),但下班后无法正常工作。
问题
是否可以在一个 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:orders 桌子
ID | order_ID | item_ID | quantity
======================================
1146 | 195 | 52 | 3
1145 | 195 | 1 | 4
1142 | 193 | 41 | 1
1141 | 193 | 40 | 3
1031 | 177 | 45 | 3
1032 | 177 | 46 | 2
1030 | 177 | 42 | 2
881 | 150 | 47 | 1
880 | 150 | 39 | 3
882 | 150 | 41 | 3
展品 B:items 表
(提供完整性,非关键信息) https://cldup.com/ZQEDy-vef6.png
图表 C:查询和结果
SELECT DISTINCT o.order_ID,
GROUP_CONCAT(o.`item_ID`) as item_IDs,
GROUP_CONCAT(o.`quantity`) as quantities
FROM orders o
GROUP BY o.`order_ID`
HAVING 7 = SUM(o.`quantity`) AND
3 = COUNT(*)
ORDER BY o.`order_ID` DESC
.
order_ID | item_IDs | quantities
=================================
177 | 42,45,46 | 2,3,2
150 | 39,47,41 | 3,1,3
115 | 39,47,41 | 3,1,3
108 | 48,45,46 | 2,3,2
图表 D:SQLFiddle
【问题讨论】:
标签: mysql join count sum having