Mehrere Tabellen miteinander vergleichen

stefjoe

Benutzer
Beiträge
7
Hallo zusammen,

ich habe 5 Tabellen:
user, country, region, status und search

in der search Tabelle sind Suchkriterien gespeichert, z.B. DE, 80636, Marketing

user hat eine id(PK) und name
alle anderen id(PK), usersId und evtl. die Werte der search.

Jetzt möchte ich gerne die Tabellen nach den Suchkriterien der search überprüfen.
Dabei müsste zuerst die usersId der search und die Werte selektiert werden, um dann die region, country, status zu überprüfen.

Als Ausgabe sollen alle möglichen User dargestellt werden.

Ich erhalte ständig alles mehrfach, also z.B. die region.plz 5x, obwohl es diese nur 1 gibt.

Hier ist meine Abfrage :confused::


SELECT *
FROM user
INNER JOIN search ON search.usersId = user.id
INNER JOIN region ON search.region = region.region
INNER JOIN country ON search.country = country.country
WHERE search.usersId = 1


Vielleicht kann mir jemand helfen, danke schon einmal :rolleyes:

Gruß
 

Anhänge

  • compare.txt
    3,2 KB · Aufrufe: 6
Werbung:
du joinst ja auch mehrfach, daher je join-treffer ein Record im Result.

Dein Table-Design erscheint etwas suboptimal, wozu dient die search-tabelle?
 
Hallo akretschmar,

danke für deine Antwort.

Die search Tabelle soll eine Suche eines Users speichern, also praktisch wie ein Filter, dafür gibt es ein Formular.
Also wenn der User mit der ID 1 nach Mitarbeitern in DE, 80636, Marketing sucht, dann soll beim starten der Anwendung praktisch alle User die in DE, 80636 wohnen und im Marketing arbeiten ausgegeben werden.

Ich bin nicht so der DB Spezialist, das ist schon etwas länger bei mir her.


Gruß
 
So recht will das nicht klappen, jetzt habe ich das mal so probiert:

SELECT *

FROM user
INNER JOIN search ON search.usersId = user.id
INNER JOIN region ON user.id = region.usersId
INNER JOIN country ON user.id = country.usersId
INNER JOIN status ON user.id = status.usersId
WHERE search.usersId = 5


Meine Ausgabe

5 Heinz 5 CH 5 7856 Vertrieb 5 5 7856 5 5 CH 5 5 Vertrieb
5 Heinz 6 DE 5 47798 Angestellter 5 5 7856 5 5 CH 5 5 Vertrieb
 
laß die search-table beim joinen weg.

select * from users inner join region on users.id=region.usersid inner join country on users.id=country.usersid inner join status on users.id=status.usersid where users.id=5;
In produktivem Code bitte nicht * verwenden, sondern alle benötigten Spalten aufzählen. Aliase können Schreiborgien minimieren.

(user ist ein reserviertes Wort, das solltest Du nicht als tablename verwenden. ich hab die tabelle daher users genannt)
 
Jetzt bekomme ich alle Daten des Users mit der ID 5, so wollte ich das nicht.

Wie kann ich die search-table integrieren und danach meine Users suchen?
 
Du hattest aber erst: "WHERE search.usersId = 5".

Ich versteh noch immer nicht axakt den Sinn Deiner search-table. Ich seh aber gerade, daß Deine Beispieldaten offenbar eh falsch sind, weil Du in search eine usersid = 1 hast und in users keinen mit dieser ID. Foreign Keys und referentielle Integrität sind was feines, gell?

Wenn ich das korrigiere auf usersid =1 kann ich z.B. basierend auf deiner search-table alle mit country = 'US' abfragen:

Code:
test=*# select * from users inner join region on users.id=region.usersid inner join country on users.id=country.usersid inner join status on users.id=status.usersid where users.id in (select usersid from search where country = 'US');
 id |  name  | id | usersid | region | id | usersid | country | id | usersid |  status   
----+--------+----+---------+--------+----+---------+---------+----+---------+--------------
  2 | Helmut |  2 |  2 | 79653  |  2 |  2 | US  |  2 |  2 | Angestellter
  1 | Hans  |  1 |  1 | 47798  |  1 |  1 | US  |  1 |  1 | Angestellter
(2 Zeilen)
 
Das müsste jetzt so passen:

select * from users
inner join region on users.id=region.usersid
inner join country on users.id=country.usersid
inner join status on users.id=status.usersid
where users.id in (select usersId from search where country = 'DE' AND region LIKE '7%');


Wie gesagt mit DB kenne ich mich so nicht aus.

Die search-Tabelle ist sozusagen mein Muster, nach dem in den Tabellen country, region, status gesucht werden muss.

Also wenn in der search-Tabelle id:1, usersId:2, country: DE, region:80636, status:Vertrieb eingetragen ist,
Dann sollen die Tabellen country, region, status danach durchsucht werden

1. Hat der User 2 ein Suchmuster in der search-Tabelle angelegt
2. Gibt es irgendeinen user aus dem country DE -> ist search.country = country.country
3. Der auch aus der region 80636 kommt -> ist search.region = region.region
4. Und zudem noch im Vertrieb arbeitet -> ist search.status = status.status
5. Wenn das zutrifft, dann sollen alle diese User ausgegeben werden


Wenn du aber einen Verbesserungsvorschlag hast, wie ich das besser machen könnte, dann höre ich sehr gerne hin :)

Vielen Dank nochmal
 
Hallo nochmal,

macht das ein Unterschied ob ich die Abfrage unter Mac oder Windows teste?
Weil unter Windows es nicht mehr funktioniert.

Unter Mac verwende ich Navicat und unter Windows phpmyadmin, aber eigentlich dürfte das doch keine Probleme machen.
 
Werbung:
Ja da hast du recht :)

Also unter Mac wird alles so ausgegeben wie gewünscht, also die User die aus DE kommen und im 7er PLZ Bereich wohnen.
Unter Windows wird genau nur der 1 User ausgegeben, der in der search Tabelle hinterlegt ist.


z.B.

Mac:
2 | Helmut | 2 | 2 | 79653 | 2 | 2 | US | 2 | 2 | Angestellter
1 | Hans | 1 | 1 | 47798 | 1 | 1 | US | 1 | 1 | Angestellter

Win:
2 | Helmut | 2 | 2 | 79653 | 2 | 2 | US | 2 | 2 | Angestellter
 
Zurück
Oben