sql >> Databáze >  >> RDS >> Mysql

SQL dotaz pro porovnání řetězce odděleného čárkami s řetězcem odděleným čárkami?

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.



  1. Vypsat omezení pro všechny tabulky s různými vlastníky v PostgreSQL

  2. MySQL:Aktualizujte více sloupců, pokud se jejich hodnota rovná

  3. Použijte Cloud Formation Templates ke spuštění instancí MySQL na RDS

  4. Vyberte z n-tého záznamu a tak dále v MySQL