Tidak praktis untuk mencocokkan nilai apa pun dalam string yang dipisahkan koma dengan nilai apa pun dalam string yang dipisahkan koma lainnya dalam satu predikat.
Anda dapat menggunakan FIND_IN_SET() untuk mencari satu nilai pada satu waktu.
Ini berarti Anda memerlukan beberapa predikat, satu untuk setiap nilai yang Anda dapatkan dengan membagi input Anda $subsector_text
. Jadi pisahkan variabel Anda dan petakan ke dalam serangkaian panggilan FIND_IN_SET().
Saya belum menguji kode berikut, tetapi seharusnya memberi Anda gambaran tentang apa yang saya bicarakan:
$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)
...";
Ini tentu saja akan memaksa pemindaian tabel karena tidak ada cara untuk mengindeks FIND_IN_SET(), atau operasi lain apa pun yang mencari substring. Yah, saya kira kondisi Anda di a.state
dan a.sector
akan menggunakan indeks untuk mempersempit pencarian sebelum menerapkan kondisi FIND_IN_SET().
Saya memahami dilema karena harus bekerja dengan sistem yang Anda warisi. Beri tahu manajer Anda bahwa ini perlu difaktorkan ulang di beberapa titik, karena tidak akan pernah efisien atau dapat diandalkan seperti yang dirancang sekarang.