MySQL: Suche mit Postleitzahlen und vier Tabellen

Quests Sohn

Mitglied
Hallo,

ich möchte eine Regional-Suche einsetzen und habe vier Tabellen,
die berücksichtigt werden müssen:

1. Der Nutzer (users):
userid, zipid, zip, name, ...

2. Die Nutzerstatistik (stats):
userid, login, status, ...

3. Die vom Nutzer gewählten Themen (usertopics):
userid, topic

4. Die Regionen (locations):
zipid, zip, city, area, county, ...

Ich möchte jeden Nutzer finden, der
- einen aktiven Account hat (status = '1')
- sich für ein vorgegebenes Thema interessiert (topic = 'xyz')
- in einer vorgegebenen Region lebt (county = 'NRW')

Muss ich jetzt wirklich eine Abfrage machen, in der alle Postleitzahlen
der vorgegebenen Region mit

PHP:
... WHERE zip = '12345' OR zip = '12346' OR zip = '12347' ...

einzeln aufgeführt werden? Das wäre ja ein unendlicher String.
NRW (Nordrhein-Westfalen) hat z. B. über 800 Postleitzahlen.

Denke ich hier zu kompliziert? Ich komme irgendwie nicht weiter.


Danke!!


Der fragliche Code bisher:


PHP:
// 1. Alle Nutzer, die sich für das vorgegebene Thema interessieren:
$sql_users = "SELECT * FROM users usa INNER JOIN stats sta USING (userid) INNER JOIN usertopics uto USING (userid) WHERE uto.topicid = '" . $topicid . "' AND sta.status = '1'"; 
$res_users = @mysql_query($sql_users); 
$users = @mysql_fetch_array($res_users); 

// 2. Alle Postleitzahlen in der vorgegebenen Region:
$sql_zips = "SELECT * FROM locations WHERE zipcounty = '" . $zipcounty . "'"; 
$res_zips = @mysql_query($sql_zips); 
$zips = @mysql_fetch_array($res_zips);
 
Ich weiß nicht ob ich dein Problem richtig verstanden habe.

Du hast einen Nutzer, dem eien zipid zugewiesen is. Diese zipid befindet sich in den locations. Und du willst jetzt alle Nutzer ermitteln, die (über die zipid) bei county z.B. NRW haben?
Wieso willst du dann die zips per Hand in dein Statement einfügen? Selektiere doch einfahc per Subselect alle zips, die bei county den gewünschten Wert aufweisen.
 
hallo hammet,

das hört sich gut an. Dummerweise bin ich kein Profi und muss mich mal
umschauen, ob ich irgendwo eine Anleitung für Subselects finde.

Ich denke, grundsätzlich könnte das funktionieren.
Ich gehe mal auf die Suche ...


Danke erstmal!
 
Also ein Subselect ist einfach ein Select, welches sich innerhalb eines anderen Statements befindet.
Ein select liefert immer eine Ergebnistabelle zurück (unabhängig von der Anzahl der Zeilen). Mal ein einfaches Beispiel:

Code:
SELECT name, vorname FROM menschen WHERE wohnort_id IN (SELECT id FROM wohnorte WHERE land = 'Deutschland' )

Du selektierst alle Menschen bei denen sich der Wohnort in der Ergebnistabelle des zweiten Selects befindet.

Ich hoffe ich konnte das etwas verdeutlichen ;)
 
So spontan und ohne jede Gewähr:

PHP:
SELECT * FROM users usa INNER JOIN stats sta USING (userid) INNER JOIN usertopics uto USING (userid) WHERE uto.topicid = '" . $topicid . "' AND sta.status = '1' AND zip = (SELECT zzip FROM locations WHERE county = 'NRW')

Verbessert mich wenn ich mit der Vermutung falsch liege.


EDIT: Ups, zu spät und scheinbar dann auch noch falsch !
 
Danke, im Prinzip ist das die Lösung!


Mein Problem ist jetzt nur, dass die Abfrage

PHP:
$sql = "SELECT zip FROM locations WHERE zip IN (SELECT zip FROM locations WHERE county = 'Nordrhein-Westfalen')"; 
$res = mysql_query($sql); 
$array = mysql_fetch_array($res);

nur einen einzelnen Datensatz ausgibt. Das liegt sicher an fetch_array(), oder?!
Aber wie kann ich ein einfaches Array bekommen, wie etwa

Array {
[0] 12345​
[1] 12350​
[2] 12355​
}

ohne noch zusätzlich eine while()-Schleife einzusetzen?
 

Neue Beiträge

Zurück