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.state
và a.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ờ.