Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Permintaan lanjutan (?) DAN / ATAU

Saya harus mengatakan - saya bingung. Saya tidak bisa memikirkan solusi apa pun yang akan mendekati. Saya akan mencoba mencari solusi ke arah ini:

  • Fungsi agregat yang ditentukan pengguna. Mungkin Anda bisa membuat fungsi yang mengambil ekspresi yang diinginkan sebagai argumen (dalam sintaks yang disederhanakan) dan baris untuk satu orang. Fungsi kemudian mem-parsing ekspresi dan mencocokkannya dengan baris. Hmm... mungkin MySQL menyertakan beberapa fungsi agregat gabungan dan fungsi pencocokan regex? Ini mungkin solusi (walaupun mungkin tidak terlalu cepat).
  • Fungsi analitik. Saya tidak berpura-pura bahwa saya memahami mereka, tetapi sebanyak yang saya tahu tentang mereka, saya pikir mereka umumnya ke arah ini. Meskipun saya tidak tahu apakah akan ada fungsi yang sesuai dengan kebutuhan ini.

Ditambahkan: Ahh, saya pikir saya mengerti! Meskipun saya pikir kinerjanya akan menyedihkan. Tapi ini akan berhasil! Misalnya, jika Anda memiliki persyaratan untuk mencari 1 AND 2 AND (3 OR 4) maka Anda akan menulis:

SELECT
    *
FROM
    Persons A
WHERE
    EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=1)
    AND
    EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=2)
    AND
    (
        EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=3)
        OR
        EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=4)
    )

Ditambahkan 2: Ini satu lagi, meskipun kinerjanya kemungkinan akan lebih buruk:

SELECT p.* FROM Person p
    JOIN (select PersonID from PersonCriteria WHERE CriteriaID=1) c1 ON p.PersonID=c1.PersonID
    JOIN (select PersonID from PersonCriteria WHERE CriteriaID=2) c2 ON p.PersonID=c2.PersonID
    JOIN (select PersonID from PersonCriteria WHERE CriteriaID IN (3,4)) c3 ON p.PersonID=c3.PersonID

Ditambahkan 3 Ini adalah variasi dari No. 2, tetapi ini mungkin sebenarnya memiliki peluang kinerja yang layak!

SELECT p.* FROM
    Person p
    JOIN PersonCriteria c1 on (p.PersonID=c1.PersonID AND c1.CriteriaID=1)
    JOIN PersonCriteria c2 on (p.PersonID=c2.PersonID AND c2.CriteriaID=2)
    JOIN PersonCriteria c3 on (p.PersonID=c3.PersonID AND c3.CriteriaID IN (3,4))

Jika Anda menambahkan indeks ke PersonCriteria pada kolom (PersonID,CriteriaID) (tepat dalam urutan ini!), maka menurut saya ini secepat yang akan Anda dapatkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengatur koneksiPool crash Slick 3.0

  2. Menghapus non-alphaNumerics di MySQL

  3. array_push() vs. $array[] =.... Mana yang tercepat?

  4. Gabungkan dua kolom dari dua tabel menjadi satu

  5. Kembalikan jumlah baris yang terpengaruh oleh pernyataan SQL UPDATE di Java