Bagaimana untuk Menyertai Jadual dengan Cekap dengan LIMIT 1 pada Jadual Bercantum?

Linda Hamilton
Lepaskan: 2024-11-15 21:05:02
asal
605 orang telah melayarinya

How to Efficiently Join Tables with LIMIT 1 on a Joined Table?

Cekap Mencantumkan Jadual dengan LIMIT 1 pada Jadual Bercantum

Masalah:

Untuk menyertai dua jadual sambil mengambil hanya satu rekod daripada jadual bercantum untuk setiap rekod dalam jadual utama, khususnya dalam konteks di mana berbilang rekod wujud dalam gabungan jadual.

PENYELESAIAN MENGGUNAKAN SUBQUERY:

Pendekatan ini secara berkesan memintas ralat yang timbul apabila memilih berbilang lajur daripada jadual yang dicantumkan sambil mengehadkan hasil kepada satu rekod. Kuncinya ialah menggunakan subkueri untuk mendapatkan kunci utama rekod yang dikehendaki. Subkueri kemudiannya digunakan untuk menapis jadual yang dicantumkan dalam pertanyaan utama.

SELECT
c.id,
c.title,
p.id AS product_id,
p.title AS product_title
FROM categories AS c
JOIN products AS p ON
p.id = (                                 --- the PRIMARY KEY
SELECT p1.id FROM products AS p1
WHERE c.id=p1.category_id
ORDER BY p1.id LIMIT 1
)
Salin selepas log masuk

Pertanyaan ini menunjukkan prestasi yang unggul, walaupun apabila jadual yang digabungkan mengandungi bilangan rekod yang jauh lebih besar daripada jadual utama.

Pendekatan Alternatif:

Walaupun pendekatan subkueri secara amnya optimum, terdapat alternatif kaedah yang ada. Walau bagaimanapun, adalah penting untuk mempertimbangkan potensi implikasi prestasi mereka.

  • Menggunakan GROUP BY dan Array Agregation (HAD TIDAK Berkenaan):
SELECT
  id,
  category_title,
  (array_agg(product_title))[1]  
FROM
    (SELECT c.id, c.title AS category_title, p.id AS product_id, p.title AS product_title
    FROM categories AS c
    JOIN products AS p ON c.id = p.category_id
    ORDER BY c.id ASC) AS a 
GROUP BY id, category_title;
Salin selepas log masuk
  • Menggunakan CROSS JOIN dan ROW_NUMBER (LIMIT NOT Berkenaan):
SELECT
  c.id,
  c.title,
  p.id AS product_id,
  p.title AS product_title
FROM categories AS c
CROSS JOIN (SELECT product_id, title, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY id) AS rn
            FROM products) AS p
WHERE rn = 1;
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menyertai Jadual dengan Cekap dengan LIMIT 1 pada Jadual Bercantum?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan