在 MySQL 中实现一个复杂的查询
Posted
技术标签:
【中文标题】在 MySQL 中实现一个复杂的查询【英文标题】:Implementing a complex query in MySQL 【发布时间】:2015-12-31 21:05:04 【问题描述】:我有 3 张桌子:
-
餐桌用品
表格子产品
桌子库存。
我想像下面的结果表一样加入这些表。事实上,我想要 所有产品 具有 最低价格 并且 count 大于零 并作为最新记录插入!
如何查询?
更多解释:
table product
----------------------------------
pid | title | desc | content |
----------------------------------
1 | lumia 920| ..... | ...... |
----------------------------------
2 | galaxys6 | .... | ...... |
----------------------------------
table sub_product
------------------------
subid |pid| name |
------------------------
1 | 1 | yellow |
------------------------
2 | 1 | black |
------------------------
3 | 2 | 32 GB |
table stock
-----------------------------------------------
sid |subid| price | count | inserted_date |
-----------------------------------------------
1 | 1 | 100 | 5 | 2015-01-01 |
-----------------------------------------------
2 | 1 | 150 | 9 | 2015-01-02 |
-----------------------------------------------
3 | 1 | 100 | 0 | 2015-02-02 |
-----------------------------------------------
4 | 2 | 111 | 1 | 2015-02-21 |
-----------------------------------------------
5 | 3 | 50 | 7 | 2015-02-01 |
-----------------------------------------------
6 | 3 | 10 | 4 | 2015-03-06 |
-----------------------------------------------
7 | 3 | 400 | 9 | 2015-06-06 |
-----------------------------------------------
table result
------------------------------------------------------------
pid |subid| title | name | price | count | inserted_date
------------------------------------------------------------
1 | 2 |lumia 920| black | 111 | 1 | 2015-02-21
------------------------------------------------------------
2 | 3 |galaxy s6| 32 GB | 10 | 4 | 2015-03-06
------------------------------------------------------------
正如您在产品表中看到的,我们有两个产品 lumia 920 和 Galaxy s6 在 sub_product 中,我们有 3 个与产品相关的项目。 还有库存我保存了每件商品的价格和数量的所有修改 所以我想返回每个 sub_product 的最新修改作为它的当前状态 sub_prodct 结果价格最低 但如果计数为零,则应返回具有上述条件的另一个子产品。
【问题讨论】:
如果您在问题中实际包含纯文本表,它总是有很大帮助,因为社区中的许多人在回答时会使用它们来创建 SQL 演示。最好粘贴到格式化的表格中(使用空格、管道、逗号等)突出显示它并ctl-k
或使用
编辑器工具栏按钮将其格式化为代码块。
具有子产品 ID 或唯一记录的多条记录?有项目计数
所有价格最低的产品?什么时候发生?否则价格相同,只有一种产品存在,价格最低。
最低价格意味着你需要给 ASC 定价?
在库存表中存储一个产品的所有修改,如果价格、数量或折扣发生了变化,我插入一条新记录。所以我想要产品表中的所有产品,这些产品基于最新的子产品修改,价格最低且数量大于零。
【参考方案1】:
Select * From stock s Join sub_product sp On s.sub_productid = sp.sub_productid Join product p On p.productid = sp.productid
Where s.counte > 0 And s.date_insert in (Select MAX(date_insert) as d From stock ss
where s.sub_productid = ss.sub_productid group by sub_productid)
【讨论】:
【参考方案2】:此查询将返回所有具有最低价格、计数大于0和最新记录的产品。
SELECT p.pid, sp.subid, p.title, sp.name, s.price, s.count, s.inserted_date
FROM product p
INNER JOIN sub_product sp ON sp.pid = p.pid
INNER JOIN stock s ON s.subid = sp.subid
WHERE s.count > 0
GROUP BY p.title
ORDER BY s.inserted_date DESC, s.price ASC
【讨论】:
这不是我的要求,也许我解释得不好!我编辑了帖子,请再次阅读非常感谢 @esmaeilbahrani:感谢您的更新,我已经更新了我的答案并且它很完美,我通过创建虚拟表进行了测试...试试吧 感谢@devpro,我试试看,但这不是我的要求!两个常见的子产品之间应该选择最低价格!在上面的示例中,您可以看到,在 subid 1 和 2 之间的 table stock 中,我们选择 2,因为它的值小于 subid 1 是的,你是对的,我正在检查它是由于@esmaeilbahrani 分组而发生的【参考方案3】:试试这样的:
SELECT prod.title, prod.desc, subProd.spid, subProd.pid, subProd.name, stk.price, stk.discount, stk.count, stk.inserted_date
FROM products AS prod
INNER JOIN sub_products AS subProd ON prod.pid = subProd.pid
INNER JOIN stock AS stk ON subProd.spid = stk.spid
AND stk.count > 0
AND stk.spid = (select spid from stock order by inserted_date desc limit 1)
【讨论】:
不,这不是我的要求!请再次检查我更新的问题,非常感谢以上是关于在 MySQL 中实现一个复杂的查询的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Postgresql 中实现对复杂嵌套 JSONB 的全文搜索