php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 16.08.2011, 18:33  
Neuer Benutzer
 
Registriert seit: 16.08.2011
Beiträge: 15
PHP-Kenntnisse:
Anfänger
AgentSasori befindet sich auf einem aufstrebenden Ast
Standard Klassiker: Frage zu JOINS

Hallo liebe Community.

Wie so viele habe ich so meine Probleme bei SQL-Abfragen (mySQL) über mehrere Tabellen. Leider sind JOINS noch nicht in Fleisch und Blut übergegangen.
Ich denke schon ich habe es grundsätzlich verinnerlicht, aber es hängt halt.

Folgendes Szenario:

Tabelle 1: Events
- ID
- Place (enthält Wert "plz" aus Tabelle Postleitzahlen)
- UserID (enthält ID aus "Users")
- Active (Event überhaupt aktiv?
...usw.

Tabelle 2: Postleitzahlen
- ID
- plz
- Ort
...usw

Tabelle 3: Bookings (Teilnahmen an den Events)
- ID
- UserID (ID aus "Users")
- EventID (ID aus "Events")
- Active (0 = keine Teilnahme, 1 = Teilnahme freigeschaltet)

In meine Problemfall möchte ich alle Events (Empfehlungen) auflisten, die
1) aktiv sind (Tabelle Events)
2) nicht dem aktuellen User gehören (Events.UserID <> $UserID)
3) im PLZ-Bereich $plzAREA +5000 UND $plzAREA - 5000 (Tabelle Postleitzahlen)
4) an dem der User nicht bereits teilnimmt (Tabelle Bookings), zu prüfen natürlich OB er in der Bookings mit DEM Event steht und das Booking auch AKTIV ist
a) Events.Place verknüpft mit Postleitzahlen.plz (ort etc holen)

Anfangs hatte ich alles ohne separaten JOIN (ala FROM Events,Users,Postleitzahlen). Nun bin ich der Übersichtlichkeithalben auf separate JOINs gegangen, zumal hier die Priorität irgendwie klarer sein sollte.

Raus kam das:
PHP-Code:
SELECT Events.Title,Events.UserID,date_format(Events.Start'%d.%m.%Y %H:%i'),Postleitzahlen.plz,Postleitzahlen.ort,Events.ID 
                                            FROM Events
Bookings
                                            INNER JOIN Postleitzahlen ON Postleitzahlen
.ID Events.Place AND (Postleitzahlen.plz >= $PLZarea 5000 AND Postleitzahlen.plz <= $PLZarea 5000)  
                                            
WHERE
                                              
(Bookings.UserID<>$UserID AND (Bookings.EventID<>Events.ID AND Bookings.Active>1)) AND
                                            
Events.UserID<>$UserID AND Events.Active=1
                                            ORDER BY Events
.Start 
Zugegegen, ich habe nun unzähle male umgestellt, umformuliert und verschiedene JOINS (inner, left, right). Aber es klappt nicht. Entweder bekomme ich zuviele Einträge oder gar keine.

HELP!


Danke vorab schonmal!

Super wäre, wenn man mir dann auch sagt, WAS bzw. WARUM es falsch war.
AgentSasori ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 16.08.2011, 19:35  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

zunächst mal solltest du die Abfrage lesbarer aufschreiben:
Code:
$sql = "SELECT
          Events.Title,
          Events.UserID,
          date_format(Events.Start, '%d.%m.%Y %H:%i'),
          Postleitzahlen.plz,
          Postleitzahlen.ort,
          Events.ID
        FROM
          Events, Bookings
        INNER JOIN
          Postleitzahlen
        ON
          Postleitzahlen.ID = Events.Place
        AND
          (Postleitzahlen.plz >= $PLZarea - 5000 AND Postleitzahlen.plz <= $PLZarea + 5000)
        WHERE
          Bookings.UserID<>$UserID
        AND
          Bookings.EventID<>Events.ID 
        AND
          Bookings.Active>1
        AND
          Events.UserID<>$UserID
        AND
          Events.Active=1
        ORDER BY
          Events.Start
";
Dann:
Code:
Events, Bookings
Das ist ein INNER JOIN. Bookings und Events sind doch über eine ID, die Event-ID, miteinander verknüpft. Das kannst also auch gleich in einem ON-Block fordern.
Code:
Bookings.Active>1
Das wird wohl nie wahr sein, denn in der Spalte Active steht entweder eine 1 oder eine 0.
Code:
Bookings.EventID<>Events.ID
Was soll das bewirken? Du suchst alle Events und Bookings die einander zugeordnet sind, negierst das dann aber wieder?
Asipak ist offline   Mit Zitat antworten
Alt 16.08.2011, 20:06  
Neuer Benutzer
 
Registriert seit: 16.08.2011
Beiträge: 15
PHP-Kenntnisse:
Anfänger
AgentSasori befindet sich auf einem aufstrebenden Ast
Standard

Hallo.

Danke für dein posting und die übersichtliche Schreibweise

Also...
Zitat:
Das ist ein INNER JOIN.
Das ist mir klar. Aber
Zitat:
Bookings und Events sind doch über eine ID, die Event-ID, miteinander verknüpft
hm... Ist das immer so (automatisch?) mir nicht klar.
Zitat:
Das kannst also auch gleich in einem ON-Block fordern
Du meinst ala: Bookings.ID = Events.ID ? Wozu?

Zitat:
Das wird wohl nie wahr sein, denn in der Spalte Active steht entweder eine 1 oder eine 0.
Korrrekt! Mein Fehler (1:0). Fehlt natürlich ein =...also >=1

Zitat:
Was soll das bewirken? Du suchst alle Events und Bookings die einander zugeordnet sind, negierst das dann aber wieder?
Ich vermute hier einen Denkfehler. Die Events, zu denen ein passendes Bookings vom aktuellen User existieren, sollen gefiltert werden.
Wie in der Beschreibung oben:
KEINE Events mit anzeigen, für die vom aktuellen User eine Buchung (Bookings) vorliegt. (Dabei fällt mir gerade ein, Active kann vernachlässigt werden in der Bookings in diesem Bezug.)

Nochwas:
Der bisherige SQL (und da war ich gestern nacht hängen geblieben) bringt den Fehler
Code:
Unknown column 'Events.Place' in 'on clause'
Wie kann das sein? Er hat die Tabelle Events doch aus dem ersten FROM? Das Feld Place gibt es (enthält die Postleitzahlen.plz)
AgentSasori ist offline   Mit Zitat antworten
Alt 16.08.2011, 20:14  
Neuer Benutzer
 
Registriert seit: 16.08.2011
Beiträge: 15
PHP-Kenntnisse:
Anfänger
AgentSasori befindet sich auf einem aufstrebenden Ast
Standard

Ich muss zugeben, mir ist in Sachen JOINS etwas noch unklar.

Die Postleitzahlen-Tabelle wird im wesentlichten gebraucht, aus der in Events.Place angegebenene ID (die Postleitzahlen.ID) die richtige Postleitzahl und den Ort zu extrahieren. Achso, und um einen Bereich von +5000 und -5000 um die angegebene PLZ (die aus der Postleitzahlen.ID gewonnen wird) zu bekommen. Dies soll (der erste Teil davon, das Extrahieren) das Suchergebnis nicht reduzieren bzw. beeinflussen. Wie stelle ich das in SQL richtig dar?

Wobei DAS von der Grundsache zu funktionieren scheint. Aber alles was mit Bookings zu tun hat, läuft nicht (bis jetzt).

Im Klartext:
Es werden immer noch Events angezeigt, die der aktuelle User bereits gebucht hat.
AgentSasori ist offline   Mit Zitat antworten
Alt 16.08.2011, 20:15  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat:
Bookings und Events sind doch über eine ID, die Event-ID, miteinander verknüpft
hm... Ist das immer so (automatisch?) mir nicht klar.
Nein, die Beziehung musst du natürlich selbst vorher festgelegt haben.

Zitat:
KEINE Events mit anzeigen, für die vom aktuellen User eine Buchung (Bookings) vorliegt.
Dann musst du natürlich auch die Ergebnisse selektieren, die du mit einem INNER JOIN nicht erreichst. Dazu bietet sich ein LEFT oder RIGHT JOIN an.
Du könntest dann zum Beispiel die Anzahl der Bookings des Users für ein Event zählen. Ist die Anzahl 0, selektierst du das Event.
Asipak ist offline   Mit Zitat antworten
Alt 16.08.2011, 20:25  
Neuer Benutzer
 
Registriert seit: 16.08.2011
Beiträge: 15
PHP-Kenntnisse:
Anfänger
AgentSasori befindet sich auf einem aufstrebenden Ast
Standard

Eigentlich ist die Anforderung gar nicht so hoch, aber es hängt irgendwo. Vielleicht ist es einfacher, jemand der das kann, einfach die Richtige SQL zu verfassen. Dann wird mir das sicher klarer.

Hier nochmal die Anforderung:
Alle Events, die

a) aktiv sind (Events.Active>=1)
b) nicht vom aktiven User selbst (Event.UserID <> $UserID)
c) es keine Buchung vom aktuellen User gibt (Bookings.UserID <> $UserID)
d) im Postleitzahlenbereich +-5000 liegt (Postleitzahlen.plz > $plzAREA -5000 AND Postleitzahlen.plz < $plzAREA +5000)

und es muss aus der Postleitzahlen die Felder .plz und .Ort geholt werden, die passende ID ist Events.Place (müsste eigentlich Event.PostleitzahlenID heißen).

Kurzum:
Aktive Events aus der Gegend, die nicht vom user selbst sind und die er bisher nicht gebucht hat.

AgentSasori ist offline   Mit Zitat antworten
Alt 16.08.2011, 20:31  
Neuer Benutzer
 
Registriert seit: 16.08.2011
Beiträge: 15
PHP-Kenntnisse:
Anfänger
AgentSasori befindet sich auf einem aufstrebenden Ast
Standard

Nach Deinem Hinweis auf LEFT/RIGHT Joins komme ich auf
Code:
SELECT
      Events.Title,
      Events.UserID,
      date_format(Events.Start, '%d.%m.%Y %H:%i'),
      Postleitzahlen.plz,
      Postleitzahlen.ort,
      Events.ID 
    FROM 
      Events
        LEFT JOIN
          Bookings
        ON
          Bookings.UserID<>$UserID
        AND
          Bookings.EventID<>Events.ID
        INNER JOIN 
          Postleitzahlen 
        ON 
          Postleitzahlen.ID = Events.Place 
        AND 
          Postleitzahlen.plz >= $PLZarea - 5000 
        AND 
          Postleitzahlen.plz <= $PLZarea + 5000  
    WHERE
      Events.UserID<>$UserID
    AND 
      Events.Active>=1
    ORDER BY 
      Events.Start
Aber so in der Art sah es heut nacht schon aus. Es kommt ein Ergebnis (kein Fehler), aber auch die Events die der User bereits gebucht hat ... Verflixtes Ding..


[MOD: Codeformatierung]
AgentSasori ist offline   Mit Zitat antworten
Alt 16.08.2011, 20:54  
Neuer Benutzer
 
Registriert seit: 16.08.2011
Beiträge: 15
PHP-Kenntnisse:
Anfänger
AgentSasori befindet sich auf einem aufstrebenden Ast
Standard

Ooops. Da ist noch ein Fehler drin glaube ich:
Code:
Bookings.EventID<>Events.ID
sollte eher
Code:
Bookings.EventID=Events.ID
heißen.

Ergebnis aber immernoch zuviele (auch die gebuchten).
Außerdem frage ich mich, warum nun der Fehler nicht mehr auftaucht (s.O.):
Zitat:
Unknown column 'Events.Place' in 'on clause'
Die SQL ist an der Stelle gleich, aber der Fehler weg. Wie geht das?
AgentSasori ist offline   Mit Zitat antworten
Alt 16.08.2011, 22:23  
Neuer Benutzer
 
Registriert seit: 19.03.2011
Beiträge: 26
PHP-Kenntnisse:
Anfänger
imamk befindet sich auf einem aufstrebenden Ast
Standard

Hi,

ich würde da außer joins mal mit subquery ran gehen.

gruß
imamk ist offline   Mit Zitat antworten
Alt 16.08.2011, 22:42  
Neuer Benutzer
 
Registriert seit: 16.08.2011
Beiträge: 15
PHP-Kenntnisse:
Anfänger
AgentSasori befindet sich auf einem aufstrebenden Ast
Standard

Sind die nicht "Altbacken" und werden nicht von jedem server unterstützt?
AgentSasori ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
PHP Test Frage (Variablen) Bloodcell PHP Einsteiger 12 04.08.2011 20:01
Eine Frage zum guten Code-Layout SilentSight JavaScript, Ajax und mehr 3 14.07.2010 09:18
[Erledigt] Frage zu JOIN Befehl und dem Auslesen desselben apo PHP Tipps 2010 11 13.06.2010 19:32
[SQL - Verständnissfrage] Sind Joins schneller als "normale" Datenbankabfragen? Larkin Off-Topic Diskussionen 6 20.09.2009 15:42
[Erledigt] frage PHP Tipps 2005-2 9 15.06.2005 13:22
.htaccess - Frage Stümper PHP Tipps 2005 11 30.05.2005 11:56
Mysql Joins Datenbanken 5 26.05.2005 21:15
Performence Frage PHP-Fortgeschrittene 10 06.05.2005 19:00
Frage zu einem Editformular PHP Tipps 2005 3 25.04.2005 14:58
Frage: gibt es bei PHP sowas wie target="_blank" PHP Tipps 2005 6 20.04.2005 06:27
mal ne Frage PHP Tipps 2005 7 14.04.2005 09:46
Technische Frage zur Realisation einer Online-Umfrage Stefano PHP Tipps 2005 5 16.03.2005 17:39
Frage zu einer Liste? HTML, Usability und Barrierefreiheit 2 15.02.2005 16:56
Hallo und Frage zu dynamischer Veränderung in Textfeldern. PHP Tipps 2004-2 2 27.12.2004 22:29
[Erledigt] Frage zur Funkrionen? PHP Tipps 2004-2 10 01.12.2004 09:42

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sql postleitzahl extrahieren, php joins

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:40 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum