Cara mencari tajuk dan menggunakan lajur lain untuk menyemak keunikan
P粉244155277
P粉244155277 2024-04-02 21:49:55
0
1
480

Saya mempunyai beberapa data produk yang dikikis dalam pangkalan data dan saya mahu menggunakannya di tapak web saya. Saya ingin menulis pertanyaan yang mengembalikan semua item dengan tajuk "%EXAMPLE%" tetapi hanya produk unik.

Masalahnya ialah saya mempunyai beberapa baris untuk 1 item, dan saya hanya mahu mengembalikan 1 baris setiap produk (saya mengikis setiap hari, jadi saya mendapat baris tambahan setiap item setiap hari). Satu-satunya perbezaan antara baris ialah mereka mempunyai tarikh dan harga yang lain, kerana itulah sejarah harga yang saya cari.

Contoh: Kami ada 3 item: coklat merah jambu, epal merah jambu dan pear merah jambu. Terdapat 3 baris untuk setiap item kerana saya menconteng 3 kali. Contohnya (untuk tujuan contoh ini, saya tidak menambah semua lajur lain):

ID Produk Tajuk Harga Tersedia
ABC123DEF Epal Merah Jambu 0.47 1
ABC123DEF Epal Merah Jambu 0.42 1
ABC123DEF Epal Merah Jambu 0.41 1
ABC333FHG Pink Merah Jambu 0.41 1
ABC333FHG Pink Merah Jambu 0.41 1
ABC333FHG Pink Merah Jambu 0.41 1
FH5845FJG Coklat Merah Jambu 0.41 1
FH5845FJG Coklat Merah Jambu 0.41 1
FH5845FJG Coklat Merah Jambu 0.41 1

Hasil yang saya nak dapat ialah:

ID Produk Tajuk Harga Tersedia
ABC123DEF Epal Merah Jambu 0.47 1
ABC333FHG Pink Merah Jambu 0.41 1
FH5845FJG Coklat Merah Jambu 0.41 1

Nampaknya saya perlu mencari tajuk dan kemudian menapis produkId pendua untuk mendapatkan hasil yang betul. Tetapi saya tidak tahu bagaimana untuk melakukannya.

Ada idea?

P粉244155277
P粉244155277

membalas semua(1)
P粉298305266

Contoh:

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;

Pertanyaan menyimpan baris harga tertinggi untuk setiap ID produk dan memadamkan baris lain untuk produk tersebut.

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

Nota - Setiap baris lengkap yang mesti disimpan adalah unik (baris yang mesti dipadamkan mungkin mempunyai pendua lengkap).


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

Pertanyaan ini tidak memerlukan baris menjadi unik, yang mana hanya satu salinan baris dikembalikan. Jika anda memerlukan semua salinan, gunakan RANK() atau DENSE_RANK() dan bukannya ROW_NUMBER().


Penyelesaian untuk versi MySQL 5.x.

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

Pertanyaan ini akan mengembalikan semua replika jika wujud. Jika anda hanya memerlukan satu salinan, tambah DISTINCT.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan