首頁  >  問答  >  主體

在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粉285587590439 天前597

全部回覆(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
  • 取消回覆