php sql suche

JesusFreak777

Erfahrenes Mitglied
Hallo,

ich möchte gerne meine SQL Datenbank durchsuchen, so sieht mein SELECT aus:

Code:
SELECT * FROM article 
WHERE ARTIKELNR LIKE ('%".$_POST['suche']."%') 
OR LFDNR LIKE ('%".$_POST['suche']."%') 
OR TEXT LIKE ('%".$_POST['suche']."%')  
OR BEZEICHNUNG LIKE ('%".$_POST['suche']."%') 
OR SUCHARTIKELNR LIKE ('%".$_POST['suche']."%')

wenn ich jetzt nach artikel suche und gebe ein:

VW erhalte ich zu viele Ergebnisse, deshalb muss ich nach VW GOLF suchen...
wenn ich allerdings GOLF VW suche, findet er wieder nichts -> da dies auch so nirgendwo in der Datenbank steht...

jetzt habe ich mir überlegt meine Suchbegriffe mit einem explode aufzusplitten ->
wie kann ich jetzt mit SQL mehrere Suchbegriffe logisch durchsuchen? Mit logisch meine ich, grundsätzlich müssen alle Suchbegriffe gefunden werden (also ein AND) aber Sie müssen nicht in richtiger Reihenfolge eingegeben werden

bei zwei oder Suchbegriffen könnte ich noch mein SELECT so dynamisch aufbauen das es einfach nach ein, zwei oder drei Suchbegriffen sucht... aber ab dann wird es Komplex -> wie machen es die großen?

Ziel ist es EIN Textfeld zu haben und aus 15000 Artikeln egal ob ich Artikelnummer oder Typ oder ne Kombination aus beidem eingebe immer meinen Artikel finden kann (oder zumindest eine liste erstellen kann mit max 10-15 Einträgen)

Vielen Dank für jeden Tipp

NACHTRAG: eine Idee war es einfach die Suche (für jeden Begriff) öfters durchlaufen zu lassen und dann einfach die gefundenen Zeilen zu vergleichen -> aber selbst da weiß ich nicht wie ich logisch vergleichen kann...

Gruß baer
 
Zuletzt bearbeitet:
oke,...

ich bin einen schritt weitergekommen!
Ich mache jetzt einfach meinen SQL abruf pro Suchbegriff und erzeuge ein großes array:

Code:
   array[s1]( 
      array(ID => 2, nochwas...)
      array(ID => 7, nochwas...)
      array(ID => 4, nochwas...)
      array(ID => 1, nochwas...))
   array[s2]( 
      array(ID => 6, nochwas...)
      array(ID => 3, nochwas...)
      array(ID => 1, nochwas...))
   array[s3]( 
      array(ID => 9, nochwas...)
      array(ID => 1, nochwas...)
      array(ID => 4, nochwas...))

jetzt suche ich nach einer Funktion, die mir aus dem großen Array, ein Array erstellt in dem nur die Subarrays zurückgegeben werden bei denen die ID in jedem Array gleich ist (die ID muss nicht zwingend eine Integer sein)!

in diesem Fall wäre es die 1!

wie stelle ich das unkompliziert an?

Danke
 
Versuche mal ob das hier passt:

PHP:
<?php
// hier müssen natürlich alle Felder rein
$feld = array("ARTIKELNR", "LFDNR", "TEXT");

$suche = "vw golf 1991 klima 4227";

$suche_array = explode(" ", $suche);

$suche_like = implode("%' OR {$feld[0]} LIKE '%", $suche_array);

$sql = "
    SELECT * FROM article
    WHERE ARTIKELNR LIKE '%" . $suche_like ."%' ";

$suche_like = implode("%' OR {$feld[1]} LIKE '%", $suche_array);
$sql .= "
    OR LFDNR LIKE '%" .$suche_like ."%'";

$suche_like = implode("%' OR {$feld[2]} LIKE '%", $suche_array);
$sql .= "
    OR TEXT LIKE '%" .$suche_like ."%'";
// usw. usw.
echo $sql;

?>
 
Zuletzt bearbeitet:
Hallo,

nein, leider ist das nicht ganz so wie ich mir das vorstelle,...
Vor allem weil ja auch ein Golf im Text und ein Klima in der Bezeichnung auch gefunden werden sollte!
 
Ich kann zwar die Abfrage die so gebildet wird nicht testen weil ich nicht die Daten dazu habe aber eigentlich sollte es genau das machen was du suchst.

Hast du es mal probiert?

NACHTRAG: Wie man oben sieht habe ich die SQL-Anweisung selber nochmal geändert, da das eine oder andere Anführungszeichen falsch gesetzt war. Ansonsten stimmt es so aber meiner Meinung nach.
 
Zuletzt bearbeitet:
Code:
WHERE nummer LIKE '%kran%' OR '%takeuchi%' OR '%1991%' OR '%funk%' OR '%3566%'

…muss vermutlich lauten:

Code:
WHERE
  nummer LIKE '%kran%'
  OR nummer LIKE '%takeuchi%'
  OR nummer LIKE '%1991%'
  OR nummer LIKE '%funk%'
  OR nummer LIKE '%3566%'

Escaping fehlt auch. (Nur am Rande.)

Ich würde aber vermuten, dass das das DBMS unter ganz massive Last setzt. (Vorsicht auch bei LIKE und etwaigen Wildcards.)

Ein „FULLTEXT“-Index wäre sicherlich günstiger. Vielleicht sogar dafür eine Extraspalte/-tabelle für Suchbegriffe anlegen, die bei Änderungen am Datensatz immer entsprechend aktualisiert wird.
 
Zuletzt bearbeitet:
@mermshaus:

Ich bin da immer wieder zwischen den "Originaldaten" und meinen "Testdaten" hin- und hergesprungen und muss zugeben das ich da wohl was durcheinander gebracht habe.

Oben ist es jetzt aber soweit behoben, es sind nur nicht alle Felder in der Abfrage enthalten.

Escaping habe ich mir gesspart weil "meine" Daten fest vorgegeben sind. Was die Last der Datenbank angeht, da könntest du recht haben.
 
hallo,

vielen dank für die Tipps, testen kann ich das erst morgen...

meine Idee war es einfach die Tabelle mehrfach zu durchsuchen und dann "einfach" die Arrays auszusortieren, aber auch da komm ich noch nicht weiter...

das mit dem OR verstehe ich nicht so ganz! -> mit meinen halb wissen sagt das OR mir das mein Suchbegriff1 oder mein Suchbegriff2 da sein soll! Ich möchte aber das sowohl mein Suchbegriff1 als auch (AND) mein Suchbefriff2 -> egal wo (im Datensatz) -> und ab da wirds dann lang, wenn ich alle Möglichkeiten auflisten muss...

Suchindex ist leider auch sehr kompliziert, da die Datenbank von einem externen Programm geschrieben wird und das so oder so schon sehr steif ist :( ...

letztlich reden wir hier von "irgendwann" mal max 100000 Datensätzen... die Frage ist wie Ressourcenlastig es ist diese "mehrfach" zu durchsuchen...
-> bisher gab es eine sehr komplexe suche, bei der man schon wissen musste was man wirklich will... von daher (selbst wenn man) sind sogar 10 Sekunden Wartezeit ein Fortschritt.

-> aber wenn dann gleich richtig, ich lasse mich gerne eines besseren belehren.
 
Du meinst so?

Code:
  (col1 LIKE '%s1%' OR col2 LIKE '%s1%' OR …)
AND
  (col1 LIKE '%s2%' OR col2 LIKE '%s2%' OR …)
AND
  …
 

Neue Beiträge

Zurück