Mysql Übereinstimmungen finden

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Sprint

Erfahrenes Mitglied
Hallo zusammen,

ich habe hier das Problem, daß ich in einer Adressentabelle Übereinstimmungen finden muß. Das ist prinzipiell kein Problem:
SQL:
SELECT n.*
FROM niederlassungen n
INNER JOIN (
SELECT plz, ort, str, hausnr
FROM niederlassungen
GROUP BY plz, ort, str, hausnr
HAVING COUNT(kunde) > 1) dup ON n.plz = dup.plz AND n.ort = dup.ort AND n.str = dup.str AND n.hausnr = dup.hausnr
Allerdings werden mir damit natürlich alle Übereinstimmungen gefunden. Wenn ich der Suche eine Kundennummer gebe, soll nun nur die übereinstimmende Adresse gefunden werden.

So sähe z.B. die obige Abfrage aus:
Code:
kunde    plz        ort        str        hausnr
100        10000    Berlin    Kudamm       17
140        10000    Berlin    Kudamm       17
955        50000    Köln      Hauptstr.    100
7          50000    Köln      Hauptstr.    100
654        80000    München   Leopoldstr.  9
111        80000    München   Leopoldstr.  9
7          60000    Frankfurt Kaiserstr.   210
123        60000    Frankfurt Kaiserstr.   210
Ich muß jetzt der Suche z.B. die Kundennummer 7 übergeben und will als Ergebnis die 955 und die 123 bekommen, da die übereinstimmende Adressen besitzen.

Natürlich könnte ich die kompletten Fundstellen auf Übereinstimmungen durchsuchen, aber das wäre doch ziemlich umständlich. Deshalb würde mich interessieren, ob das mit Mysql alleine auch machbar wäre und wenn, dann wie.
 
SQL:
SELECT n.*
FROM 
    niederlassungen n
    INNER JOIN (
        SELECT plz, ort, str, hausnr
        FROM niederlassungen
        GROUP BY plz, ort, str, hausnr
        HAVING COUNT(kunde) > 1
    ) dup 
    ON n.plz = dup.plz 
    AND n.ort = dup.ort 
    AND n.str = dup.str 
    AND n.hausnr = dup.hausnr
WHERE
    n.kunde=7
 
Hi Yaslaw,

damit bekomme ich alle Einträge von der Kundennummer 7 aber die habe ich ja schon. Ich suche die anderen Kunden, deren Daten mit denen der 7 übereinstimmen. In dem Beispiel also die 955 und die 123.
 
Entweder
SQL:
select *
from niederlassungen
where 
    kunde != 7
    and (plz, ort, str, hausnr) in (
        select plz, ort, str, hausnr
        from niederlassungen
        where kunde = 7)

oder
SQL:
select n.*
from
    (select * from niederlassungen where kunde != 7) n
    inner join (select * from niederlassungen where kunde = 7) ref
    on n.plz = ref.plz 
    and n.ort = ref.ort 
    and n.str = ref.str 
    and n.hausnr = ref.hausnr
 
Bitte.
Ich persönlich finde die Erste Variante schöner. Aber ich wollte zeigen, dass es viele Wege nach Rom gibt.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
Zurück