Rumah > Soal Jawab > teks badan
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粉2983052662024-04-03 00:53:42
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 < t.price );
Pertanyaan ini akan mengembalikan semua replika jika wujud. Jika anda hanya memerlukan satu salinan, tambah DISTINCT.