Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Truy vấn nâng cao (?) VÀ / HOẶC

Tôi phải nói - Tôi bối rối. Tôi không thể nghĩ ra bất kỳ giải pháp nào có thể xảy ra. Tôi sẽ thử tìm giải pháp theo các hướng sau:

  • Các hàm tổng hợp do người dùng xác định. Có thể bạn có thể tạo một hàm nhận làm đối số là biểu thức mong muốn (theo cú pháp đơn giản hóa) và các hàng cho một người duy nhất. Sau đó, hàm phân tích cú pháp biểu thức và so khớp biểu thức với các hàng. Hmm ... có thể MySQL bao gồm một số hàm tổng hợp ghép nối và một hàm so khớp regex? Sau đó, đây có thể là một giải pháp (mặc dù có thể không nhanh lắm).
  • Các chức năng phân tích. Tôi không giả vờ rằng tôi hiểu họ, nhưng khi tôi biết về họ, tôi nghĩ họ thường theo hướng này. Mặc dù tôi không biết liệu sẽ có chức năng nào phù hợp với nhu cầu này hay không.

Đã thêm: Ahh, tôi nghĩ là tôi hiểu rồi! Mặc dù tôi nghĩ rằng màn trình diễn sẽ khốn khổ. Nhưng điều này sẽ hoạt động! Ví dụ:nếu bạn có yêu cầu tìm kiếm 1 AND 2 AND (3 OR 4) thì bạn sẽ viết:

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)
    )

Đã thêm 2: Đây là một cái khác, mặc dù hiệu suất có thể sẽ còn tệ hơn:

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

Đã thêm 3: Đây là một biến thể của số 2, nhưng nó thực sự có thể có cơ hội đạt được hiệu suất tốt!

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))

Nếu bạn thêm một chỉ mục vào PersonCriteria trên các cột (PersonID, CriteriaID) (chính xác theo thứ tự này!), Thì tôi nghĩ rằng nó nhanh như bạn sẽ nhận được trong mọi trường hợp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL kiểm tra xem bảng đã tồn tại chưa

  2. Trường hợp Mysql không hoạt động

  3. Nhận đầu ra cơ sở dữ liệu MySQL qua PHP sang XML

  4. Cách cài đặt MySQL trên CentOS 6

  5. Hệ thống thành tích / huy hiệu