SusiSorglos
26-02-2010, 07:45
Ich finde hierzu keinen passenden Lösungsweg.
Ich habe EINE Tabelle mit vielen Datensätzen. Darin enthalten sind Keywords.
In der einen Zelle steht 'hund katze maus' und in einer anderen steht z.B. 'tiger esel hund' (Kann auch gerne durch einen Seperator getrennt sein)
Ich möchte nun gerne in allen Datensätzen nach einem der drei Wörtern suchen. In dem Beispiel würde z.B. 'hund' übereinstimmen.
Weiss vielleicht jemand wie man das in eine SQL Abfrage packt ??
Cu Susi
schmalle
26-02-2010, 10:24
SELECT
was_weiss_ich_was
FROM
tabelle
WHERE
ueberdenkenswerte_spalte LIKE '%HUND%'
SusiSorglos
26-02-2010, 10:46
neeee. so war das nicht gemeint.
Es soll nur dann ein Result liefern wenn das Wort "hund" ODER "katze" ODER "maus" enthalten ist.
Ich habe also einen String mit einer unbestimmten Anzahl von Wörtern die durch ein SPACE oder "," getrennt sind.
schmalle
26-02-2010, 10:52
wie sieht die tabelle denn jetzt aus?
id | keyword
--------------
1 | hund
--------------
2 | katze
--------------
3 | fisch
oder so
id | keyword | keyword2 | keyword3
--------------------------------------
1 | hund | katze | fisch
SusiSorglos
26-02-2010, 11:01
Nagut... nochmal etwas genauer.
Ich betreibe ein NewsPortal. Jedem Artikel möchte ich nur ca 3 Keywords zuweisen. Diese werden dann zum jeweiligen Artikel in EINE Spalte geschrieben.
Wenn nun ein anderer Artikel auch innerhalb der Spalte "keywords" z.B. den Begriff "Auto" notiert hat, möchte ich dies somit verknüpfen und dem Leser als Linkvorschlag ausgeben.
Wenn der Leser sich für (Auto, Porsche, reifen) interessiert -> interessiert er sich sicherlich auch für (Auto, Ferarri, schnell)
Das klappt. Es läuft schon, aber leider bekomme ich es nur mit EINEM Wort hin. Es wäre aber sicherlich von vorteil, wenn es mehrere Keyword enthalten könnte.
Ich hoffe das war etwas verständlicher!?
Cu Susi
schmalle
26-02-2010, 11:12
Ich hoffe das war etwas verständlicher!?i
ja, aber besser macht es die Sache nicht :-)
$string_keywords = "hund,katze, fisch";
$ar_key = explode(",", $string_keywords);
$ar_like = array();
for($i=0; $i<count($ar_key); $i++)
{
$str = trim($ar_key[$i]);
if(!empty($str))
{
$ar_like = "'".mysql_real_escape_string($str)."'";
}
}
$where = '';
if(count($ar_like))
{
$where = "(\nkeywords LIKE ";
$where .= implode(" OR keywords LIKE ", $ar_like);
$where .= "\n)\nAND";
}
$query = "SELECT
id_artikel
FROM
artikel_tabelle
WHERE
".$where."
freigabe = 1 /* oder was auch immer Du so brauchst */";
// TODO: run query
SusiSorglos
26-02-2010, 11:24
Vielen Dank für Deine Mühe.
Das könnte so klappen.
Ich hatte nur gehofft das es vielleicht ganz ohne php geht. Weil ich ca 20-30 Artikel auf einmal auslese und diese dann jeweils mit 1000 Artikel vergleichen muss. Sind dann 20.000 - 30.000 Abfragen pro Seite und User. Das müsste man dann wohl schon über Temp machen.
Ich werde es heute Abend mal dem php Umweg probieren. Mal sehen wie sehr es das System belastet.
Bis heute Abend.
Cu susi
AmicaNoctis
26-02-2010, 11:29
Hallo Susi,
besser du normalisierst die DB noch ein bisschen, lagerst Keywords in eine eigene Tabelle aus und verbindest die über eine n:m-Relation mit der Artikeltabelle.
Dann kannst du das Suchen nach ähnlichen Artikeln gleich in einer Abfrage erledigen und sogar noch mit einer einfachen Relevanzsortierung ausstatten.
Gruß,
Amica
Ist ja nicht das erste mal, dass dir die Normalisierung ans Herz gelegt wird. Aber gelernt hast du aus den vermeidbaren Problemen der Vergangenheit immer noch nicht... :)