MySQL Zeilen vergleichen (elegante Lösung gesucht)

bazlivec

Mitglied
Moin,

ich habe eine Tabelle mit über 50.000 Zeilen, die wie folgt miteinander verglichen werden sollen.

Aus einer vorhergehenden Suche wird die Ursprungszeile ermittelt. Diese enthält mehrere Spalten mit "Bezeichnung" (5-10).
Nun sollen alle anderen Zeilen der Tabelle auf Übereinstimmungen in den Spalten Bezeichnung gesucht werden. Die Zeile, in der die meisten Übereinstimmungen gefunden wurden, wird ausgegeben (Spalte 1, also der Name).

Meine Idee:
Eine Schleife die alle Zeilen durchläuft und in der die Übereinstimmungen mit einer Zählvariable gespeichert werden. Die Zeile, dessen Zählvariable den höchsten Wert hat, wird ausgelesen/ausgegeben.
Die Suche bzw. der Vergleich findet per AND und OR statt.

Das ist wahrscheinlich nicht sehr elegant und von der Schreiberei her kompliziert.
Gibt es da eine bessere Lösungsmöglichkeit?

MfG
baz
 
Ich verstehe dich nicht ganz.
Du willst die Spalten zusammenzählen und dann nur 1 Zeile (Zitat: "Die Zeile, dessen Zählvariable den höchsten Wert hat") ausgeben?

Das würde so nicht gehen, da das Zählen der Spalten ja Zeilenüberergreifend ist.
:rolleyes:

Kannst du eventell nochmal etwas deutlicher schildern was du vorhast (eventuell eine Beispieltabelle)?
 
Würde auch empfehlen mal das Datenbankmodell zu zeigen. Ich nehme stark an, dass sich das über ein einzelnes passendes SQL-Statement lösen lässt.
 
Ok, hier nochmal der Tabellenaufbau:

Titel...|..Bezeichnung..|..Bezeichnung2..|..Bezeichnung3..| ...
-------------------------------------------------------------------------
Blabla.|..toll................|....schoen..........|....klasse............| ...
Aha....|..sehr gut........|....schoen..........|....annehmbar....| ...
Des....|..geht..............|....ok.................|....NULL.............| ...
Das....|..toll................|....klasse............|....NULL.............| ...

Aus einer vorhergehenden Suche wird die Zeile "Blabla" ermittelt (hierzu kein Code gesucht!).
Nun soll die Gesamte Tabelle, also alle Zeilen, nach Übereinstimmungen mit den Bezeichnungen von "Blabla" durchsucht werden.
Das Ergebnis wäre hier: "Das". Weil es die meisten Übereinstimmungen in den Bezeichnungen hat (2 (toll, klasse)).

Ich hoffe das ist verständlicher ?(
 
Zuletzt bearbeitet:
Code:
SELECT Titel, Bezeichnung, Bezeichnung2, Bezeichnung3
   FROM xbelibigeTabelle
   WHERE Bezeichnung=suchwort1 + Bezeichnung2=suchwort2 + Bezeichnung3=suchwort3 >1
suchwort1, suchwort2, suchwort3 sind die Suchbegriffe aus den Spalten Bezeichnung, Bezeichnung2, Bezeichnung3, die aus der TabellenZeile BLA 'ermittelt' wurden.

Der Code gibt somit die Datensätze aus, wo mind. 2 Bedingungen erfüllt sind.

Den Code auf Deine Bedürfnisse anpassen.

Gruss Rainer
 
@raiguen:
Ich glaube, er möchte auch, dass suchwort1 mit den Feldern Bezeichnung2 und Bezeichnung3 verglichen wird (analog dazu die anderen Suchbegriffe).

@bazlivec:
Du solltest auf jeden Fall erkennen, dass du mit den Beschreibungen Redundanzen verursachst. Außerdem ist es nicht so clever, in einer Tabelle mehrere Beschreibungen auf mehrere Felder aufzuteilen (siehe Post von Sebastian Schmidt bzgl. 3NF).
Das lässt sich besser mit einer extra Tabelle für die Beschreibungen und einer Zwischentabelle für die m-x-n-Beziehung zwischen den Titeln und eben jenen Beschreibungen lösen.
 
@erik s.:
okay, wenn ich mir das Beispiel vom TE ansehe, dann passt mein Code natürlich so nicht; die anderen Möglichkeiten habe ich schlichtweg übersehen/überlesen ;)
 
Zuletzt bearbeitet:
Du solltest auf jeden Fall erkennen, dass du mit den Beschreibungen Redundanzen verursachst. Außerdem ist es nicht so clever, in einer Tabelle mehrere Beschreibungen auf mehrere Felder aufzuteilen (siehe Post von Sebastian Schmidt bzgl. 3NF).

Eine Beschreibung besteht immer nur aus einem Wort. Das Ziel der Suche ist es einen Titel zu finden, der möglichst viele, gleiche Beschreibungen hat wie der Titel der Sucheingabe.

@raiguen: So in der Art, wie du gepostet hast, müsste es doch aussehen.
Code:
WHERE Bezeichnung=suchwort1 OR Bezeichnung=suchwort2 OR ..
Bezeichnung2=suchwort1 OR Bezeichnung2=suchwort2 OR ..

So in der Art.. Das mit dem "mindestens 2 Bedingungen erfüllt" ist genau das was ich suche.
 
Code:
SELECT spalte 
FROM tabelle 
WHERE bezeichnung IN($bezeichnung1, $bezeichnung2, $bezeichnung3) OR WHERE bezeichnung2 IN($bezeichnung1, $bezeichnung2, $bezeichnung3) OR WHERE bezeichnung3 IN($bezeichnung1, $bezeichnung2, $bezeichnung3)
ORDER BY id DESC;

Wie sieht es damit aus? Wenn es so eine "gute" Lösung wäre: Wie schaffe ich es, dass nur das Ergebnis mit den meisten Treffern ausgegeben wird?
Bei dem obigen Code muss ja auch nur eine Zelle einer Bedingung entsprechen. :(
 
Zurück