Bestimmte Ergebnisse einer Suchabfrage

Hallo!
Ich habe folgendes Problem im Zusammenhang mit einer Suchabfrage und möchte gerne wissen, ob jemand einen guten Tip für mich hat:

Mit Hilfe eines Formularfeldes, in das der Kunde ein oder mehrere Suchwörter eingeben kann (Eingabe wird als $su weitergegeben) lasse ich eine Tabelle mit Buchtitteln durchsuchen, und zwar so:

<?php if (!isset($su)) {
echo (" Du må skrive inn eit søkjeord! "); } // Wenn nichts eingetragen wurde, wird hier abgebrochen. else { # Begriff wird zerlegt, falls ein Leerzeichen vorkommt $suche = ' '; $var = stristr($su, $suche); if($var) { $array = explode(' ', $su); $su1 = $array[0]; $su2 = $array[1]; // Datenbank wird abgefragt $suchergebnis = mysql\_query(" SELECT id,tittel,forfattar\_utg,UNIX\_TIMESTAMP(dato) FROM bokliste WHERE status!=1 AND tittel LIKE '%$su%' OR status!=1 AND tittel LIKE '%$su1%' OR status!=1 AND tittel LIKE '%$su2%' OR status!=1 AND soekjeord LIKE '%$su%' OR status!=1 AND soekjeord LIKE '%$su1%' OR status!=1 AND soekjeord LIKE '%$su2%' OR status!=1 AND forfattar\_utg LIKE '%$su%' OR status!=1 AND forfattar\_utg LIKE '%$su1%' OR status!=1 AND forfattar\_utg LIKE '%$su2%' ORDER BY forfattar\_utg, tittel LIMIT $anfangsposition,$zeilen\_pro\_seite "); if (!$suchergebnis) { echo(" Det oppstod ein feil ved å ta kontakt med databasen! ". "Feil: " . mysql\_error() . " "); exit(); } } else { // Datenbank wird abgefragt $suchergebnis = mysql\_query(" SELECT id,tittel,forfattar\_utg,UNIX\_TIMESTAMP(dato) FROM bokliste WHERE status!=1 AND tittel LIKE '%$su%' OR status!=1 AND forfattar\_utg LIKE '%$su%' OR status!=1 AND soekjeord LIKE '%$su%' ORDER BY forfattar\_utg, tittel LIMIT $anfangsposition,$zeilen\_pro\_seite "); if (!$suchergebnis) { echo(" Det oppstod ein feil ved å ta kontakt med databasen! ". "Feil: " . mysql\_error() . " "); exit(); } } Das mit dem Teilen des Begriffs habe ich nachträglich gemacht, weil mein Auftraggeber eine größere Anzahl Ergebnisse bei der Suche haben wollte. Die Felder, die bei der Suche berücksichtigt werden sind eins mit dem Buchtitel (tittel), eins mit dem Autor (forfattar\_utg; die Namen sind nach dem Muster Nachname, Vorname abgelegt) und eins mit weiteren Suchbegriffen (soekjeord). Das funktioniert auch alles ganz gut, nur gibt es jetzt folgendes Problem: Wenn man zum Beispiel als Suchbegriffe "Anne Holt" eingibt (eine Autorin), dann erscheinen ihre Bücher erst auf Seite 3 der Ergebnislisten. Vorher stehen eben alle anderen Buchtitel, die entweder "Anne" oder "Holt" enthalten. Man kann sich das ganze auch unter [www.bokbyen.no/bokliste\_no.php](http://www.bokbyen.no/bokliste_no.php) 'life' angucken. Wie erreiche ich, dass die Bücher von Anne Holt ganz oben auf der Ergebnisliste erscheinen? Es wäre schön, wenn mir jemand weiterhelfen könnte. Beste Grüße Karen

Hallo!

und wesentliches in lesbar gesetzt

SELECT id,tittel,forfattar\_utg,UNIX\_TIMESTAMP(dato)
 FROM bokliste
 WHERE status!=1 AND tittel LIKE '%$su%'
 OR status!=1 AND tittel LIKE '%$su1%'
 OR status!=1 AND tittel LIKE '%$su2%'
 OR status!=1 AND soekjeord LIKE '%$su%'
 OR status!=1 AND soekjeord LIKE '%$su1%'
 OR status!=1 AND soekjeord LIKE '%$su2%'
 OR status!=1 AND forfattar\_utg LIKE '%$su%'
 OR status!=1 AND forfattar\_utg LIKE '%$su1%'
 OR status!=1 AND forfattar\_utg LIKE '%$su2%'
 ORDER BY forfattar\_utg, tittel
 LIMIT $anfangsposition,$zeilen\_pro\_seite

Hallo Karen,
ad 1) mein Norwegisch ist gleich null :smile:
ad 2) dein SQL verbesserungswürdig

SELECT id,tittel,forfattar\_utg,UNIX\_TIMESTAMP(dato)
 FROM bokliste
 WHERE status!=1 AND (tittel LIKE '%$su%'
 OR tittel LIKE '%$su1%'
 OR tittel LIKE '%$su2%'
 OR soekjeord LIKE '%$su%'
 OR soekjeord LIKE '%$su1%'
 OR soekjeord LIKE '%$su2%'
 OR forfattar\_utg LIKE '%$su%'
 OR forfattar\_utg LIKE '%$su1%'
 OR forfattar\_utg LIKE '%$su2%')
 ORDER BY forfattar\_utg, tittel
 LIMIT $anfangsposition,$zeilen\_pro\_seite

ad 3) zur Deiner eigentlichen Frage: Ich schlage ein UNION mit einer Sortierung nach Wichtigkeit vor (ungetestet, aber es müsste so gehen):

SELECT 1 as wichtig,id,tittel,forfattar\_utg,UNIX\_TIMESTAMP(dato)
 FROM bokliste
 WHERE status!=1 AND (tittel LIKE '%$su%'
 OR soekjeord LIKE '%$su%'
 OR forfattar\_utg LIKE '%$su%')
UNION
SELECT 2,id,tittel,forfattar\_utg,UNIX\_TIMESTAMP(dato)
 FROM bokliste
 WHERE status!=1 AND (tittel LIKE '%$su1%'
 OR tittel LIKE '%$su2%'
 OR soekjeord LIKE '%$su1%'
 OR soekjeord LIKE '%$su2%'
 OR forfattar\_utg LIKE '%$su1%'
 OR forfattar\_utg LIKE '%$su2%')
 ORDER BY wichtig,forfattar\_utg, tittel
 LIMIT $anfangsposition,$zeilen\_pro\_seite

ad 4) ist Deine HP http://www.geowoerterbuch.com/ eventuell gehackt worden, oder ist viagra jetzt ein Geologie-Begriff?

MfG Georg V.

Hallo Georg,
vielen Dank für Deinen Vorschlag, werde das mit UNION mal ausprobieren. Vielen Dank auch für den Hinweis betreffend meiner Geo-Seite, da ist in der Tat jemand am Werk gewesen.

Gruß Karen

Hallo Georg,
frohes neues Jahr! Habe es jetzt endlich ausprobieren können. Mit UNION funktioniert es (fast), allerdings musste ich den Code noch leicht modifizieren, da in der DB die Autoren als „Nachname, Vorname“ abgelegt sind. Daher tauchten die als wichtig erwünschten Buchtitel am Anfang der Trefferliste nicht auf, wenn der Autor als „Vorname Nachname“ eingegeben wurde. Ich habe daher den geteilten string noch zu $su3 zusammengefügt, der dem Muster „Nachname, Vorname“ entspricht:

$array = explode(’ ', $su);
$su1 = $array[0];
$su2 = $array[1];
$su3 = „$su2, $su1“;

Bei der Abfrage verwende ich dann $su3 anstatt $su beim Autor (forfattar_utg):

$suchergebnis = mysql_query("
SELECT 1 as
wichtig,id,tittel,forfattar_utg,UNIX_TIMESTAMP(dato)
FROM bokliste
WHERE status!=1 AND (tittel LIKE ‚%$su%‘
OR soekjeord LIKE ‚%$su%‘
OR forfattar_utg LIKE ‚%$su3%‘)
UNION
SELECT 2,id,tittel,forfattar_utg,UNIX_TIMESTAMP(dato)
FROM bokliste
WHERE status!=1 AND (tittel LIKE ‚%$su1%‘
OR tittel LIKE ‚%$su2%‘
OR soekjeord LIKE ‚%$su1%‘
OR soekjeord LIKE ‚%$su2%‘
OR forfattar_utg LIKE ‚%$su1%‘
OR forfattar_utg LIKE ‚%$su2%‘)
ORDER BY wichtig,forfattar_utg, tittel
LIMIT $anfangsposition,$zeilen_pro_seite");

Ich hoffe man kann das so machen. Meine SQL-Kenntnisse sind wirklichoch nicht sehr umfangreich.

Der Grund warum die Lösung noch nicht 100%ig ist, ist die Tatsache, dass in der Ergebnisliste Titel doppelt auftauchen. Du kannst es testen, wenn Du auf der Seite

www.bokbyen.no/bokliste_no.php

z.B. „Knuth Becker“ im Feld unter „Frisøk“ eingibst.

Ich habe schon probiert, anstatt UNION einfach UNION DISTINCT zu schreiben, leider ohne Erfolg.

Weisst Du wie man die doppelten Ergebnisse wegkriegt?

Beste Grüße
Karen

Entschuldigung, es funktioniert leider doch nicht. Denn beim Vorgehen wie unten beschrieben steht zwar der gewünschte Autor, z.B. „Anne Holt“ ganz oben (wenn auch doppelt) wenn die Eingabe „Vorname Nachname“ war. Bei der Eingabe „Nachname Vorname“ oder „Nachname, Vorname“ steht er jedoch erst wieder auf Seite 4 der Ergebnisliste.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Georg,
frohes neues Jahr! Habe es jetzt endlich ausprobieren können.
Mit UNION funktioniert es (fast), allerdings musste ich den
Code noch leicht modifizieren, da in der DB die Autoren als
„Nachname, Vorname“ abgelegt sind. Daher tauchten die als
wichtig erwünschten Buchtitel am Anfang der Trefferliste nicht
auf, wenn der Autor als „Vorname Nachname“ eingegeben wurde.
Ich habe daher den geteilten string noch zu $su3
zusammengefügt, der dem Muster „Nachname, Vorname“ entspricht:

$array = explode(’ ', $su);
$su1 = $array[0];
$su2 = $array[1];
$su3 = „$su2, $su1“;

Bei der Abfrage verwende ich dann $su3 anstatt $su beim Autor
(forfattar_utg):

$suchergebnis = mysql\_query("
SELECT 1 as wichtig, id,tittel,forfattar\_utg,UNIX\_TIMESTAMP(dato)
 FROM bokliste
 WHERE status!=1 AND (tittel LIKE '%$su%'
 OR soekjeord LIKE '%$su%'
 OR forfattar\_utg LIKE '%$su3%')
UNION
SELECT 2,id,tittel,forfattar\_utg,UNIX\_TIMESTAMP(dato)
 FROM bokliste
 WHERE status!=1 AND (tittel LIKE '%$su1%'
 OR tittel LIKE '%$su2%'
 OR soekjeord LIKE '%$su1%'
 OR soekjeord LIKE '%$su2%'
 OR forfattar\_utg LIKE '%$su1%'
 OR forfattar\_utg LIKE '%$su2%')
 ORDER BY wichtig,forfattar\_utg, tittel
 LIMIT $anfangsposition,$zeilen\_pro\_seite");

gelöscht :
Ich habe schon probiert, anstatt UNION einfach UNION DISTINCT
zu schreiben, leider ohne Erfolg.

Weisst Du wie man die doppelten Ergebnisse wegkriegt?

Beste Grüße
Karen

Hallo Karen,

auch Dir (und den Mitlesern) ebenfalls ein Frohes Neues Jahr. Das distinct kann nicht funktionieren, da der gesamte Datensatz untersucht wird und Du hast ja explizit eine 1 bzw 2 dazu/davor geschrieben.
Das Problem kann je nach Datenmodell unterschiedlich lösen. Lösungsgrundlage muß allerdings ein eindeutiger Schlüssel sein (z.B. Deine ID könnte so etwas sein). Entweder blendet man mittels PHP die nochmals angelieferten ID’s aus oder man formuliert das SQL-Statement so um, dass alle gefundenen ID’s der ersten Abfrage nicht in der zweiten Abfrage auftauchen dürfen.

Bzgl. der Schreibweise „Name, Vorname“ in einem Attribut: Wenn Du noch kannst: Ändere es!!

Das PHP schient mir übrigens nicht ganz sauber: Eine „Holt, Anne“ wird also auch als „Anne, Holt,“ gesucht.

Bzgl. Deines Nachsatzes: Da scheint Dir aber noch mehr durchgegangen zu sein. Wenn bei Holt, Anne auch eine Agerholm, Susanne (ohne Holt in den anderen Felder (also ein logisches Oder der Suchbegriffe) kommt, dann ist dies nicht korrekt.
Hier sollte man die Anforderungen präsizieren und dann das SQL-Statement entsprechenden überarbeiten.

Kannst Dich dazu gerne per PM melden, ich helfe gerne bei solchen Tüftelein aus.

MfG Georg V.