Autor | Zpráva | ||
---|---|---|---|
Khamos Profil * |
#1 · Zasláno: 19. 2. 2012, 15:15:23
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 |
#2 · Zasláno: 20. 2. 2012, 09:32:40
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. |
||
Časová prodleva: 11 let
|
0