在MySQL数据库中使用Navicat过滤多个id值
P粉285587590
P粉285587590 2023-08-28 17:09:38
[MySQL讨论组]

我需要使用最近的到期日期和销售价格来过滤数据,而不重复 id_product,我尝试解决这个问题,但我无法找到正确的方法来做到这一点

这是 Navicat 查询和结果

SELECT
    product_exp_date.idproduct, 
    product_exp_date.exp_date, 
    product_exp_date.selling_price
FROM
    product
    INNER JOIN
    product_exp_date
    ON 
        product.idproduct = product_exp_date.idproduct
GROUP BY
    product_exp_date.exp_date
idproduct  exp_date   selling_price
8         2022-11-01      300
5         2022-06-08      370
5         2022-06-09      350
7         2022-07-01      380
5         2022-09-20      450
6         2022-10-08      140
6         2023-06-08      150

我已经尝试过这种方式

GROUP BY
    product_exp_date.idproduct

但它给了我不同的结果

idproduct  exp_date   selling_price
5         2022-06-09    350
6         2023-06-08    150
7         2022-07-01    380
8         2022-11-01    300

但我需要得到这个结果

idproduct  exp_date   selling_price
5         2022-06-08      370
6         2022-10-08      140
7         2022-07-01      380
8         2022-11-01      300

产品表

productid  product_name 
5               A     
6               B     
7               C     
8               D

产品_EXP_日期表

idproduct_exp_date  idproduct   exp_date   selling_price
      1               5        2022-06-09    350
      2               6        2023-06-08    150
      3               5        2022-06-08    370
      4               5        2022-09-20    450
      5               6        2022-10-08    140
      6               7        2022-07-01    380
      7               8        2022-11-01    300

有时我的查询有一些错误,无论如何我需要帮助来解决这个问题, 谢谢。

P粉285587590
P粉285587590

全部回复(1)
P粉481035232

首先,让我纠正一下你的说法;那不是Navicat查询,那是一个MySQL查询。现在,这是两个不同的东西。MySQL是一个数据库,Navicat是一个工具 - 类似于MySQL Workbench、PHPMyAdmin或SQLyog等其他工具。它是为了让你可以通过图形界面执行数据库功能。

接下来,我将给出两个查询,你可以根据你的MySQL版本使用其中之一。第一个查询如下:

SELECT p1.idproduct,
       p1.exp_date,
       p1.selling_price
FROM product_exp_date p1 
JOIN (
   SELECT idproduct,
       MIN(exp_date) AS minexp
   FROM product_exp_date
   GROUP BY idproduct
  ) AS p2
 ON p1.idproduct=p2.idproduct 
 AND p1.exp_date=p2.minexp
ORDER BY p1.idproduct;

你应该能够在任何版本的MySQL或MariaDB中运行上面的查询。这个查询的思路是通过idproduct分组获取最小的exp_date,然后将其作为子查询,再次与product表进行连接,以匹配这两个提取的值,以便我们可以提取selling_price

第二个查询:

SELECT idproduct,
       exp_date,
       selling_price
FROM (
   SELECT idproduct,
          exp_date,
          selling_price,
          ROW_NUMBER() OVER (PARTITION BY idproduct ORDER BY exp_date) rn
   FROM product_exp_date
  ) AS p1
WHERE rn=1;

这个查询只能在支持窗口函数的MySQL v8+或MariaDB 10.2+(及以上)上运行。与之前的查询相比,思路有点不同,这里我们将专注于根据特定条件生成ROW_NUMBER(),然后将其作为子查询,并只添加一个WHERE子句。与之前的查询相比,这不需要JOIN操作。

你可以看到,我没有考虑到product表,因为我没有看到它在你的原始查询中被使用,但如果你确实需要将其连接起来,而且你无法弄清楚如何做到,只需给我留言,我会看看我能做什么。

演示fiddle

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号