在MySQL資料庫中使用Navicat過濾多個id值
P粉285587590
P粉285587590 2023-08-28 17:09:38
0
1
613
<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粉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

#
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板