Není praktické porovnávat jakoukoli hodnotu v řetězci odděleném čárkami s jakoukoli hodnotou v jiném řetězci odděleném čárkami v jediném predikátu.
Můžete použít FIND_IN_SET() pro hledání jedné hodnoty najednou.
To znamená, že potřebujete více predikátů, jeden pro každou hodnotu, kterou získáte rozdělením vstupu $subsector_text
. Rozdělte tedy svou proměnnou a namapujte ji na řadu volání FIND_IN_SET().
Následující kód jsem netestoval, ale měl by vám poskytnout představu, o čem mluvím:
$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)
...";
To si samozřejmě vynutí skenování tabulky, protože neexistuje způsob, jak indexovat FIND_IN_SET() nebo jinou operaci, která hledá podřetězce. Předpokládám, že vaše podmínky na a.state
a a.sector
použije index k zúžení vyhledávání před použitím podmínek FIND_IN_SET().
Chápu dilema, kdy musíte pracovat se systémem, který jste zdědili. Dejte svému manažerovi vědět, že je potřeba to v určitém okamžiku předělat, protože to nikdy nebude efektivní ani spolehlivé tak, jak je to nyní navrženo.