使用 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 因为我没有看到它在您的原始查询中的任何地方使用,但是如果您确实需要加入它,如果你不知道怎么做,请给我留言,我会看看我能做些什么。
我需要用最近的过期日期和销售价格过滤数据,不重复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 因为我没有看到它在您的原始查询中的任何地方使用,但是如果您确实需要加入它,如果你不知道怎么做,请给我留言,我会看看我能做些什么。