使用 Navicat 过滤 MySQL 数据库中的多个 id 值

Filter multiple id values in MySQL database with Navicat

我需要用最近的过期日期和销售价格过滤数据,不重复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

产品TABLE

productid  product_name 
5               A     
6               B     
7               C     
8               D     

PRODUCT_EXP_DATE TABLE

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              

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

首先,让我纠正你;那不是 Navicat 查询,那是 MySQL 查询。现在,这是两个不同的东西。 MySQL 是一个数据库,而 Navicat 是一个工具 - 等同于其他工具,如 MySQL Workbench、PHPMyAdmin 或 SQLyog。制作它是为了让您可以通过 GUI 执行数据库功能。

接下来,我将提供两个查询,您可以根据您的 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 组,然后将其作为 sub-query,再次将其与 product table 连接以匹配提取的两个值,以便我们可以提取 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;

这只能在支持 window 功能的 MySQL v8+ 或 MariaDB 10.2+(及更高版本)上 运行。这个想法与之前的查询有点不同,在这里,我们将专注于根据特定条件生成 ROW_NUMBER(),然后将其作为 sub-query 并仅添加一个 WHERE。与之前的查询相比,这不需要 JOIN.

如您所见,我没有考虑 product table 因为我没有看到它在您的原始查询中的任何地方使用,但是如果您确实需要加入它,如果你不知道怎么做,请给我留言,我会看看我能做些什么。

Demo fiddle