Autor Zpráva
Khamos
Profil *
Zdravím, mám tabulku, které obsahuje statisíce řádků. Mám proměnnou, která obsahuje slova oddělená čárkami. U některých slov je prefix @, ty se můžou vyskytovat jako části slova, ostatní jako samostatně stojící slova. Potřebuju tuto tabulku porovnat s touto proměnnou a vypsat také řádky, které obsahují slovo "auto" (pro slovo "auto"), případně slovo "stromeček" (pro slovo @strom).

Dělám to tak, že si proměnnou rozdělím na pole slov, která se mají brát jako celá a na pole slov, která mohou být jen části slov. Funguje to, problém je, že při takovém množství řádků v tabulce je dotaz hrozně náročný a server vrátí chybu 500, že nemůže dokončit operaci. Mohli byste mi pomoct to přepsat nějak efektivněji? Díky moc.

Ukázka kódu:

      $slova=explode(", ", $slova);

      $array_znak=array_filter($slova, function ($v) { return substr($v, 0, 1)=='@'; }); 
      $array_ostatni=array_diff($slova, $array_znak);

      $cele="";
      $cast="";

      foreach($array_ostatni AS $slovo) { $cele.=" OR titulek REGEXP '\[\[:<:\]\]$slovo\[\[:>:\]\]' OR text REGEXP '\[\[:<:\]\]$slovo\[\[:>:\]\]'"; }

      $cele=trim($cele, " OR ");

      foreach($array_znak AS $slovo) { $cast.=" OR titulek REGEXP '.*".str_replace("@", "", $slovo).".*' OR text REGEXP '.*".str_replace("@", "", $slovo).".*'"; }

      $cast=trim($cast, " OR ");

      if ($cele!="" AND $cast!="") { $or=" OR "; } else { $or=""; }
        
      $where=" WHERE $cele$or$cast";
      
      }

Proměnná WHERE se pak přidá do celkového SQL dotazu. Zkoušel jsem slova oddělovat v rámci reguláru (slovo1|slovo2|slovo3), žádný rozdíl.
Kajman
Profil
Můžete udělat nejdříve rychlejší omezení díky like a na tom výsledku teprve rozlišovat celoslovnost výrazů díky regexp.

Případně se mrkněte na fulltextové funkce, zda Vám nebudou vyhovovat.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0