Komplexer Datenfelder-Vergleich [mySQL]

cmyk-vienna

Erfahrenes Mitglied
Hallo liebe Leute,

ich bin gerade auf ein Problem gestoßen, wo mir einfach keine Lösung einfallen will.
Vielleicht hat von Euch jemand eine Idee.
Ich habe 2 identische Tabellen mit ID und jew. 5 INT-feldern (über Primärschlüssel verknüpft)
ID, Zahl1, ... ,Zahl5

Diese beiden Tabellen muß ich jetzt in der Form überprüfen, wieviele gleiche Zahlen aus Tabelle 1 im gleichen Datensatz in Tabelle 2 enthalten sind.

In PHP habe ich das ganz einfach mit einem array_diff gemacht, das geht aber hier aus Performancegründen nicht, da alle Datensätze durchgegangen werden müssen und die Tabellen sehr lang sind.

Bin dankbar für jede Anregung.
Lg.

//edit: Ach ja: mysql Version 4, PHP 4.3
 
Zuletzt bearbeitet:
Probier mal folgende Abfrage:
Code:
SELECT
        `id`
  FROM
        `tabelle1`
  JOIN
        `tabelle2` ON `id`
  WHERE
        `zahl1` != `zahl1`
    OR  `zahl2` != `zahl2`
    OR  `zahl3` != `zahl3`
    OR  `zahl4` != `zahl4`
    OR  `zahl5` != `zahl5`
Wahrscheinlich geht das noch einfacher.
 
Hallo,

das wird wohl so nicht funktionieren, Gumbo, da zahl1, zahl2 etc. in der WHERE-Klausel mehrdeutig sind.

@cmyk-vienna: Eins ist mir noch nicht klar: muss eine Zahl, damit sie gewertet wird, in beiden Tabellen in der gleichnamigen Spalte stehen oder genügt es, wenn eine Zahl einer Tabelle in einer beliebigen Spalte der anderen Tabelle steht?

Grüße,
Matthias
 
Hi
Erstmal danke für die schnelle Reaktion.
@ Gumbo
Das wird leider nicht funktionieren, da die Reihenfolge der Zahlen in den Datensätzen beliebig ist.
Ich machs mal mit einem Beispiel:
Tabelle 1 enthält:
1,2,3,4,5
Tabelle 2 enthält:
1,3,5,7,9
In diesem Fall hätte ich also 3 Übereinstimmungen.

@ Mathias: Das mit der Mehrdeutigkeit habe ich schon mit Aliases gelöst.

Ich hab schon an ein COUNT (...) gedacht, wußte aber nicht wie ich es einbauen soll.
Danke und lg.
 
Hallo,

folgendes sollte klappen:
Code:
SELECT
  `t1`.`ID`,
  ( IF(`t1`.`zahl1` IN (`t2`.`zahl1`, `t2`.`zahl2`, `t2`.`zahl3`, `t2`.`zahl4`, `t2`.`zahl5`), 1, 0) +
    IF(`t1`.`zahl2` IN (`t2`.`zahl1`, `t2`.`zahl2`, `t2`.`zahl3`, `t2`.`zahl4`, `t2`.`zahl5`), 1, 0) +
    IF(`t1`.`zahl3` IN (`t2`.`zahl1`, `t2`.`zahl2`, `t2`.`zahl3`, `t2`.`zahl4`, `t2`.`zahl5`), 1, 0) +
    IF(`t1`.`zahl4` IN (`t2`.`zahl1`, `t2`.`zahl2`, `t2`.`zahl3`, `t2`.`zahl4`, `t2`.`zahl5`), 1, 0) +
    IF(`t1`.`zahl5` IN (`t2`.`zahl1`, `t2`.`zahl2`, `t2`.`zahl3`, `t2`.`zahl4`, `t2`.`zahl5`), 1, 0)
  ) AS `common`
FROM `tabelle1` `t1`
LEFT JOIN `tabelle2` `t2` USING(`ID`);
Vielleicht kann man das auch noch irgendwie vereinfachen, aber mir fällt grad nicht ein, wie.

Grüße,
Matthias
 
Danke Matthias!
Ich werd das gleich mal probieren.
Das kann ich sicher so anpassen, daß es das tut was es soll.
Vielen Dank für die Hilfe!
Schöne Grüße.

//edit:
So: Abfrage ist eingebaut und funktioniert einwandfrei. Einfacher ist es zwar nicht geworden - eher noch um einiges umfangreicher (ein weiterer join und having bla bla) aber laufen tuts wie ein Einser!
Danke für die Unterstützung!
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück