如何搜尋標題並使用另一列來檢查唯一性
P粉244155277
P粉244155277 2024-04-02 21:49:55
0
1
379

我在資料庫中有一些抓取的產品數據,我想在我的網站上使用它們。 我想編寫一個查詢,返回標題為“%EXAMPLE%”的所有項目,但僅包含唯一的產品。

問題是我有 1 個項目的多行,我只想返回每個產品 1 行(我每天都會抓取,因此每天每個項目都會獲得額外的行)。行之間的唯一區別是它們有另一個日期和價格,因為這就是我所尋找的價格歷史記錄。

範例: 我們有 3 種商品:粉紅巧克力、粉紅蘋果和粉紅梨。 每個項目有 3 行,因為我刮擦了 3 次。 例如(出於本範例的目的,我沒有添加所有其他列):

產品ID 標題 價格 可用
ABC123DEF 粉紅蘋果 0.47 1
ABC123DEF 粉紅蘋果 0.42 1
ABC123DEF 粉紅蘋果 0.41 1
ABC333FHG 粉紅梨子 0.41 1
ABC333FHG 粉紅梨子 0.41 1
ABC333FHG 粉紅梨子 0.41 1
FH5845FJG#粉紅巧克力 0.41 1
FH5845FJG#粉紅巧克力 0.41 1
FH5845FJG#粉紅巧克力 0.41 1

我想要得到的結果是:

產品ID 標題 價格 可用
ABC123DEF 粉紅蘋果 0.47 1
ABC333FHG 粉紅梨子 0.41 1
FH5845FJG#粉紅巧克力 0.41 1

看來我必須搜尋標題,然後過濾掉重複的productId,以便得到正確的結果。但我不知道該怎麼做。

有什麼想法嗎?

P粉244155277
P粉244155277

全部回覆(1)
P粉298305266

一個例子:

WITH
cte AS ( 
    SELECT *, ROW_NUMBER() OVER (PARTITION BY productId ORDER BY price DESC) rn
    FROM test
)
DELETE test
FROM test
NATURAL JOIN cte
WHERE cte.rn > 1;

查詢儲存每個產品 ID 的最高價格行,並刪除該產品的其他行。

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=40df8e8e4b3eb206e0f73b7ce3a70a a5一个>

注意 - 必須儲存的每個完整行都是唯一的(必須刪除的行可能具有完整的重複項)。


WITH
cte AS ( 
    SELECT *, ROW_NUMBER() OVER (PARTITION BY productId ORDER BY price DESC) rn
    FROM test
)
SELECT *
FROM cte
WHERE rn = 1;

此查詢不需要行是唯一的,在這種情況下只傳回一個行副本。如果您需要所有副本,請使用 RANK() 或 DENSE_RANK() 而不是 ROW_NUMBER()。


MySQL 5.x 版本的解決方案。

SELECT *
FROM test
WHERE NOT EXISTS ( 
    SELECT NULL
    FROM test t
    WHERE test.productId = t.productId
      AND test.price 

此查詢將傳回所有副本(如果存在)。如果您只需要一份副本,請新增 DISTINCT。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!