首页  >  问答  >  正文

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

<p>我需要使用最近的到期日期和销售价格来过滤数据,而不重复 id_product,我尝试解决这个问题,但我无法找到正确的方法来做到这一点</p> <p>这是 Navicat 查询和结果</p> <pre class="brush:php;toolbar:false;">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</pre> <pre class="brush:php;toolbar:false;">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</pre> <p>我已经尝试过这种方式</p> <pre class="brush:php;toolbar:false;">GROUP BY product_exp_date.idproduct</pre> <p>但它给了我不同的结果</p> <pre class="brush:php;toolbar:false;">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</pre> <p>但我需要得到这个结果</p> <pre class="brush:php;toolbar:false;">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</pre> <p>产品表</p> <pre class="brush:php;toolbar:false;">productid product_name 5 A 6 B 7 C 8 D</pre> <p>产品_EXP_日期表</p> <pre class="brush:php;toolbar:false;">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</pre> <p>有时我的查询有一些错误,无论如何我需要帮助来解决这个问题, 谢谢。</p>
P粉285587590P粉285587590388 天前560

全部回复(1)我来回复

  • P粉481035232

    P粉4810352322023-08-29 16:08:14

    首先,让我纠正一下你的说法;那不是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

    回复
    0
  • 取消回复