komplexe Suche in Mysql

Starfox2007

Mitglied
Hi zusammen,

Für eine Suchfunktion habe ich ein Script geschrieben,
Problem an der Sache ist das ich mindestens 8 Mysql Tabellen mit einer unterschiedlichen Anzahl von Spalten habe, was also ein UNION SELECT Statement ausschließt.

Ich würde das ganze eventuell mit Arrays lösen, wollte aber nochmal Euere Meinung dazu hören, wie würdet Ihr das machen ****

Mein Lösung wäre so:

PHP:
$search1 = "SELECT spalte1, spalte2, spalte3, spalte4 FROM tabelle WHERE spalte1 LIKE '%".$db->escape($search)."%' OR spalte2 LIKE '%".$db->escape($search)."%' OR spalte3 LIKE '%".$db->escape($search)."%' OR spalte4 LIKE '%".$db->escape($search)."%'";

$search2 = "SELECT spalte1, spalte2, spalte3 FROM tabelle2 WHERE spalte1 LIKE '%".$db->escape($search)."%' OR spalte2 LIKE '%".$db->escape($search)."%' OR spalte3 LIKE '%".$db->escape($search)."%'";

$search3 = "SELECT spalte1, spalte2, spalte3, spalte4 FROM tabelle3 WHERE spalte1 LIKE '%".$db->escape($search)."%' OR spalte2 LIKE '%".$db->escape($search)."%' OR spalte3 LIKE '%".$db->escape($search)."%' OR spalte4 LIKE '%".$db->escape($search)."%'";

$search4 = "SELECT spalte1, spalte2 FROM tabelle4 WHERE spalte1 LIKE '%".$db->escape($search)."%' OR spalte2 LIKE '%".$db->escape($search)."%'";

$result1 = $db->query($search1);
$result2 = $db->query($search2);
$result3 = $db->query($search3);
$result4 = $db->query($search4);

while ($row = $db->fetchassoc($result1))
{
$suche[] = $row; 
}
while ($row = $db->fetchassoc($result2))
{
$suche[] = $row; 
}
while ($row = $db->fetchassoc($result3))
{
$suche[] = $row; 
}
while ($row = $db->fetchassoc($result4))
{
$suche[] = $row; 
}

So schreibe ich alle Ergebnisse in das Array $suche.
 
Das Problem ist, dass du so in deiner $suche Rows mit verschiedenen Spaltenmengen hast.
Dazu aber keine Angabe darüber aus welcher Tabelle das Resultat stammt.

Wie willst du am Ende das Resultat auswerten?
 
Wenn Du es in der Form machen willst, dann trenne die Results im Array doch noch:
PHP:
while ($row = $db->fetchassoc($result1))
{
    $suche['result1'][] = $row; 
}
while ($row = $db->fetchassoc($result2))
{
    $suche['result2'][] = $row; 
}
usw...

Gruß
 
Ja das ist wohl war, das mit dem auswerten wird so schwer.

Dann sollte ich vielleicht Tabellen mit gleicher Spaltenanzahl zusammenfassen per UNION und das mit dem Array weglassen ist vielleicht sinnvoller.
 
Auch wenn die Spaltenanzahl unterschiedlich ist, kannst du doch einfach die Anzahl anpassen

SQL:
SELECT a, b, c FROM foo
UNION
SELECT a, '', '' FROM bar

Der Typ muss auch übereinstimmen, also eventuell was anderes als den Leerstring nehmen.



wie würdet Ihr das machen

Ich würde ein System benutzen, dass für Textsuche gemacht ist und nicht die DB missbrauchen (http://lucene.apache.org/ , http://lucene.apache.org/solr/).

Falls das nicht in Frage kommt, dann könntest du auch eine redundante Tabelle zum Suchen anlegen, um nicht immer den Weg über mehrere Tabellen zu gehen.
 
Funktioniert schon, ich hab nur zu komplex Gedacht.

Ich mache für jede Sparte einfach eine eigene Suchausgabe und das mit dem Array ist quatsch das bleibt weg.

Vielen Dank euch beiden ;)
 
Das mit dem Array und dem Union ist nicht schlecht. Reduziere deine Ausgabe auf 3 Felder. Die ID und den Tabellennamenund der Name des items(Also das Feld das du anzeigen willst) .

SQL:
SELECT id,  desc AS item_name, 'table1' AS table_name
FROM table1 
WHERE field1 LIKE '%suchbegriff%' OR field1 LIKE '%suchbegriff%'
UNION ALL
SELECT id, 'table12 
FROM table2 
WHERE field1 LIKE '%suchbegriff%' OR field1 LIKE '%suchbegriff%' OR field3 LIKE '%suchbegriff%'
UNION ALL
SELECT id, 'table13 
FROM table3 
WHERE field1 LIKE '%suchbegriff%'

Anschliessend kannst du die Resultate Anzeigen (Feld item_name). Wenn du wieder auf den Datensatz zugreiffen willst, hast du die ID und den Tabellennamen....
 
Zuletzt bearbeitet von einem Moderator:
Zurück