Frage zu SQL-Abfrage

DerLinsch

Neuer Benutzer
Beiträge
1
Hallo zusammen,

ich habe wenig Erfahrung mit SQL und bin mit folgendem Problem konfrontiert. Es wird eine Liste von E-Mail-Adressen und den dazugehörigen Standorten benötigt. Optimalerweise auch noch ein WHERE, um eine bestimmte Domain bei den E-Mail-Adressen herauszufiltern.
Die Tabellen sehen folgendermaßen aus:

benutzer (id, email)
standorte (id, Ort, straße)
benutzer_haben_standorte (id, id_standort, id_benutzer)

Wie kann ich in einer Abfrage eine Liste von Standorten mit den dazugehörigen E-Mail-Adressen erhalten?

Mein bisheriger Versuch ist das hier, aber sobald ich mehr daten als eine Spalte abfragen möchte, erhalte ich err 1066 unique table.

SELECT benutzer.email, standorte.firma
FROM benutzer_haben_standorte
LEFT JOIN benutzer
ON benutzer_haben_standorte.id_benutzer = benutzer.id
LEFT JOIN standorte
ON benutzer_haben_standorte.id_standorte = standorte.id
WHERE benutzer.email LIKE '%abc.de'

Danke im Voraus!
 
Werbung:
Schnellschuß, aber mit PostgreSQL:

Code:
postgres=# create table benutzer(id int primary key, email text);
CREATE TABLE
postgres=# create table standorte (id int primary key, ort text);
CREATE TABLE
postgres=# create table benutzer_standort(id_benutzer int references benutzer, standort_id int references standorte, primary key(id_benutzer,standort_id));
CREATE TABLE
postgres=# insert into benutzer values (1,'a@abc');
INSERT 0 1
postgres=# insert into benutzer values (2,'b@abc');
INSERT 0 1
postgres=# insert into benutzer values (3,'c@def');
INSERT 0 1
postgres=# insert into standorte values (1, 'berlin');
INSERT 0 1
postgres=# insert into standorte values (2, 'dresden');
INSERT 0 1
postgres=# insert into benutzer_standort values (1,1);
INSERT 0 1
postgres=# insert into benutzer_standort values (2,1);
INSERT 0 1
postgres=# insert into benutzer_standort values (3,2);
INSERT 0 1
postgres=# select s.ort, string_agg(b.email,', ') from benutzer_standort bs left join benutzer b on bs.id_benutzer=b.id left join standorte s on bs.standort_id=s.id group by s.ort;
   ort   |  string_agg  
---------+--------------
 berlin  | a@abc, b@abc
 dresden | c@def
(2 rows)

postgres=#
 
und wenn Du noch filtern willst:

Code:
postgres=# select s.ort, string_agg(b.email,', ') from benutzer_standort bs left join benutzer b on bs.id_benutzer=b.id left join standorte s on bs.standort_id=s.id where b.email ~ '.*\@abc$' group by s.ort;
  ort   |  string_agg  
--------+--------------
 berlin | a@abc, b@abc
(1 row)

postgres=# select s.ort, string_agg(b.email,', ') from benutzer_standort bs left join benutzer b on bs.id_benutzer=b.id left join standorte s on bs.standort_id=s.id where b.email ~ '.*\@def$' group by s.ort;
   ort   | string_agg 
---------+------------
 dresden | c@def
(1 row)
 
Werbung:
Grundsätzlich müsste deine Abfrage aber Daten liefern, was genau heißt denn "sobald ich mehr daten als eine Spalte abfragen möchte"? Saplte oder Zeile?

Sollen die Daten wirklich pro Standort aggregiert werden oder reicht nicht auch eine Zeile pro Standort und E-Mail Adresse?
 
Zurück
Oben