在 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 的全文搜索

在 C++ 中实现复杂的继承

如何在 Java Web 应用程序中实现复杂的页面流

Django Q AND 查找 - 在复杂查找中查询多个条目

在ABP的Web层中实现复杂请求跨域访问

EF Core 全局查询过滤器复杂表达式