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

Truy vấn SQL để khớp một chuỗi được phân tách bằng dấu phẩy với một chuỗi được phân tách bằng dấu phẩy?

Không thực tế khi so khớp bất kỳ giá trị nào trong một chuỗi được phân tách bằng dấu phẩy với bất kỳ giá trị nào trong một chuỗi được phân tách bằng dấu phẩy khác trong một vị từ.

Bạn có thể sử dụng FIND_IN_SET () để tìm kiếm một giá trị tại một thời điểm.

Điều này có nghĩa là bạn cần nhiều vị từ, một vị từ cho mỗi giá trị bạn nhận được bằng cách tách đầu vào của bạn $subsector_text . Vì vậy, hãy tách biến của bạn và ánh xạ nó thành một chuỗi các lệnh gọi FIND_IN_SET ().

Tôi chưa thử nghiệm đoạn mã sau, nhưng nó sẽ cung cấp cho bạn ý tưởng về những gì tôi đang nói:

$subsector_array = array_map('intval', explode(',', $subsector_text));
$subsector_terms = array_map(
  function ($id) { return "FIND_IN_SET($id, a.subsector)"; },
  $subsector_array);
$subsector_expr = implode(' OR ', $subsector_terms);

$sql = "
SELECT ...
          WHERE a.state = 1 
            AND a.sector = '$sector'
            AND ($subsector_expr)
...";

Điều này tất nhiên sẽ buộc phải quét bảng vì không có cách nào để lập chỉ mục FIND_IN_SET () hoặc bất kỳ hoạt động nào khác tìm kiếm chuỗi con. Vâng, tôi cho rằng điều kiện của bạn trên a.statea.sector sẽ sử dụng một chỉ mục để thu hẹp tìm kiếm trước khi áp dụng các điều kiện FIND_IN_SET ().

Tôi hiểu sự khó xử khi phải làm việc với một hệ thống mà bạn đã kế thừa. Hãy cho người quản lý của bạn biết rằng điều này cần được cấu trúc lại vào một lúc nào đó, bởi vì nó sẽ không bao giờ hiệu quả hoặc đáng tin cậy như cách nó được thiết kế bây giờ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhóm kết quả ngẫu nhiên của MySQL theo thứ tự theo

  2. Làm thế nào để sử dụng union chỉ một lần với lệnh where?

  3. tìm kiếm một phần từ mysql

  4. mysqldump với utf8 không thể xuất chuỗi biểu tượng cảm xúc phù hợp

  5. Chuyển đổi từ DOUBLE (15,2) thành DECIMAL (15,2)