Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mencari Pemain dengan Betul dalam Pasukan Dalam Julat Tahun Tertentu dalam PostgreSQL?

Bagaimana untuk Mencari Pemain dengan Betul dalam Pasukan Dalam Julat Tahun Tertentu dalam PostgreSQL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-02 22:31:39649semak imbas

How to Correctly Find Players on a Team Within a Specific Year Range in PostgreSQL?

Mencari Julat Tarikh Bertindih dalam PostgreSQL

Anda telah memberikan pertanyaan yang cuba mencari semua pemain yang berada dalam pasukan tertentu dalam tahun tertentu, tetapi ia tidak berfungsi dengan betul. Mari kita selesaikan isu yang anda hadapi dan sediakan penyelesaian alternatif untuk mencari julat tarikh yang bertindih.

Masalah dengan Pertanyaan Asal:

  • Pertanyaan salah menggunakan pengendali ANTARA untuk memasukkan tahun sempadan atas, manakala kebanyakan kes mengecualikannya.
  • Pertanyaan tidak menyemak sama ada pemain tidak pernah meninggalkan pasukan, yang juga harus disertakan.

Pertanyaan Betul:

Untuk mencari semua pemain pasukan tertentu yang menyertai sebelum 2010 dan tidak pergi sebelum 2009, anda boleh menggunakan yang berikut pertanyaan:

SELECT DISTINCT p.*
FROM team AS t
JOIN contract AS c ON t.name_team = c.name_team
JOIN player AS p ON c.name_player = p.name_player
WHERE t.name_team = ?
AND c.date_join < '2010-01-01'
AND c.date_leave >= '2009-01-01';

Pertimbangan Tambahan:

  • Jika jadual pasukan anda hanya digunakan untuk penyertaan dan tidak menambah sebarang maklumat yang diperlukan, anda boleh mudahkan pertanyaan dengan mengalih keluarnya.
  • Untuk mengendalikan pemain yang mungkin tidak pernah meninggalkan pasukan (diwakili sebagai NULL dalam date_leave), anda boleh menggunakan klausa OR:
AND (c.date_leave >= '2009-01-01' OR c.date_leave IS NULL)

Menggunakan Operator OVERLAPS:

PostgreSQL juga menyediakan operator OVERLAPS, yang boleh digunakan untuk mencari julat bertindih. Pertanyaan berikut menggunakan OVERLAPS untuk mencari pemain yang bertindih dengan julat '2009-01-01', '2010-01-01':

SELECT DISTINCT name_player
FROM contract
WHERE name_team = ?
AND (date_join, COALESCE(date_leave, CURRENT_DATE)) OVERLAPS
      ('2009-01-01', '2010-01-01');

Menggunakan Jenis Julat:

Dalam PostgreSQL 9.2 atau lebih baru, anda boleh menggunakan jenis julat untuk mewakili julat tarikh. Ini memberikan prestasi yang lebih baik dan membolehkan sokongan indeks yang lebih mudah.

CREATE TYPE date_range AS RANGE (date, date);

CREATE INDEX mv_stock_dr_idx ON mv_stock USING gist (daterange(date_join, date_leave));

SELECT DISTINCT name_player
FROM contract
WHERE name_team = ?
AND daterange(date_join, date_leave) &&&
      daterange('[2009-01-01,2010-01-01)'); -- upper bound excluded

Atas ialah kandungan terperinci Bagaimana untuk Mencari Pemain dengan Betul dalam Pasukan Dalam Julat Tahun Tertentu dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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