webForumDet fria alternativet

Hitta träffar på hela ord, inte delar av ord.

PHP

1 svar · 1 023 visningar · startad av Skatedragon

Medlem sedan juni 200332 inlägg
Frågan#1

Hej!

Jag har två tabeller i en mysql-databas.
Den ena innehåller textbaserade artiklar.
Den andra innehåller flera poster med ord som ska hittas i artiklarna.

För att hitta dessa använde jag följande SQL-sats.

//hämtar varje post från ord-tabellen och loopar dessa

$sql = "SELECT id,url,title FROM posts WHERE `desc` LIKE '%".$q2["names"]."%' AND time > '".strtotime($q2["lastchecked"])."'" or exit(mysql_error());

//loopar ut resultatet från posts

Problemet är att den matchar t.ex "Abba" med "tabbar", och jag vill bara att den ska matcha om exakt rätt ord hittas.

Dessvärre innehåller kolumnen names precis som det kan antas flera namn separerade med kommatecken.. tex namn1,namn2,namn3.

Jag har kommit en bit på vägen, men lyckas inte få till SQL-satsen riktigt. Så som det är nu hittas inga resultat alls mot tidigare ca 300.

 $sql = "SELECT id,url,title FROM posts WHERE (`desc` REGEXP '[[:<:]]" . str_replace(",","[[:>:]]' OR `desc` REGEXP '[[:<:]]",$q2["names"])."[[:>:]]') AND (`desc` REGEXP '[[:<:]]" . str_replace(",","[[:>:]]' OR `desc` REGEXP '[[:<:]]",$q2["relatedto"])."[[:>:]]') AND time > '".strtotime($q2["lastchecked"])."'" or exit(mysql_error());

Någon som har något förslag? Finns det en bättre lösning?

Medlem sedan juni 200443 inlägg
#2

Om du använder MyISAM kan du använda FullText index....

SELECT * FROM test WHERE MATCH (desc) AGAINST('$string');

CREATE TABLE test ( desc TEXT, FULLTEXT(desc) ) ENGINE=MyISAM;

866 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
172 ms — deklarationer (db)
0 ms — hämta statistik (cache)
690 ms — hämta tråd, inlägg och bilagor (db)
146 ms — ändringar (db)