php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.11.2007, 21:59  
Erfahrener Benutzer
 
Registriert seit: 21.10.2007
Beiträge: 120
prinzli
Standard JOIN / LEFT JOIN und Co

Hallo miteinander..

Da bin ich wieder..

Ich versuche nun mit mehreren Tabellen zu arbeiten, bzw. Verknüpfungen zu erstellen.. abfragen.. je nach User und so..

Nun bin ich auf den Begriff "JOIN" und "LEFT JOIN" gestossen.
Doch irgendwie habe ich bis jetzt noch nicht wirklich eine Erklärung gefunden, was man damit wirklich machen kann und wann es sinnvoll ist.

Darum meine Frage an Euch:
Was macht ein "JOIN" oder "LEFT JOIN" (und vielleicht gibt es noch mehr davon) wirklich..?

Danke für Eure Hilfe.

Gruss Prinzli
prinzli ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 04.11.2007, 14:49  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo prinzli,

mit einem JOIN kannst du Spalten verschiedener Tabellen in einem Ergebnis-Satz zusammenfassen. Ja nach Ausprägung des JOINs erhälst du unterschiedliche Ergebnisse. Ein INNER JOIN beispielsweise ist ein ausschließendes JOIN, das nur die Sätze liefert, die relevant sind. Ein LEFT bzw. RIGHT JOIN fügt Spalten links oder rechts an die bisherigen Ergebnisse an. Mit LEFT OUTER JOIN und RIGHT OUTER JOIN gibt es zwei weitere Spezialfälle. Was genau Anwendung findet, oder finden sollte entscheidet der Anwendungsfall und das Design der Tabellen in deiner Datenbank.

Möchtest du beispielsweise alle Attribute eines Users, die du aber in getrennten Tabellen "user" und "attributes" gespeichert hast, zusammenfassen, und hat die Tabelle eine Referenz auf die ID eines Benutzers, kannst du ein

Code:
SELECT user.id,user.name,attributes.* FROM user
LEFT JOIN attributes ON user.id = attributes.userid
WHERE user.id = '123';
anwenden. Weitere Beispiele findest du bei einer Forensuche, oder im MySQL Reference Manual.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 04.11.2007, 16:36  
Erfahrener Benutzer
 
Registriert seit: 21.10.2007
Beiträge: 120
prinzli
Standard

`
Hallo dr.e

Vielen Dank Deiner Erklärung..
Igendwie erscheint es mir noch nicht ganz logisch.. doch ich werde mich da schon noch reinleben..

Ich habe bis jetzt sowas gemacht:
Bei einer Registrierung werden verschiedene Werte in die Tabelle "BENUTZER" eingetragen unter anderem auch der "Benutzername".
Zugleich lasse ich den "Benutzername" in die Tabelle "BENUTZER_OPTIONEN" schreiben (die enthaltet natürlich noch weitere Spalten wei z.B. "Website").

Bei der Ansicht des PROFIL des Benutzers gebe ich die Optionen des Benutzers aus, dort kann er dann zB seine Website eintragen.
Wenn der Benutzer nun weitere Websiten eintagen möchte, kann er eine zusätzliche Option eintragen. Dort lasse ich wiederum der Benutzername eintragen zur Identifizierung, d.h. die Abfrage muss ja den dazugehörigen Benutzer zum eintrag wissen.
Das funktioniert auch ganz gut..
Meine Frage ist natürlich, ist das auch ganz ok so.. oder ist das zu kompliziert..?

Im weiteren habe ich so mal ein kleines Script erstellt (Als Übung und Test) mit Login und so...
Dies möchte ich gerne hier im Forum zeigen, ob das richtig ist so, und was es noch zu beachten gäbe, gerade wegen Sicherheit und so.

Die Frage dazu: darf ich das hier posten oder soll ich ein neues Thema schreiben..?


Vielen Dank im voraus..
gruss Prinzli
prinzli ist offline   Mit Zitat antworten
Alt 04.11.2007, 18:59  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo prinzli,

Zitat:
Meine Frage ist natürlich, ist das auch ganz ok so.. oder ist das zu kompliziert..?
Das ist kein übliches Vorgehen. Referenzen baust du i.d.R. nach dem "Foreign Key"-Prinzip auf. Das bedeutet, dass du nicht einen String, sondern eine ID verwendest. Im Fall deines Konstruktes solltest du die ID des Benutzers (Primary Key der Tabelle BENUTZER) in der Tabelle PROFIL speichern. Dann kannst du die o.g. Abfrage verwenden um dir die Attribute zu einem Benutzer zusammen zu suchen.


Zitat:
Die Frage dazu: darf ich das hier posten oder soll ich ein neues Thema schreiben..?
Kommt darauf an. Ist es ein MySQL-Problem, dann hier, ansonsten im PHP-Teil des Forums.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 04.11.2007, 20:28  
Erfahrener Benutzer
 
Registriert seit: 21.10.2007
Beiträge: 120
prinzli
Standard

Danke Dir @ dr.e.

Habe da einiges über dieses "Foreign Key" Prinzip nachgeschlagen..
Doch irgendwie stehe ich auf dem Schlauch...
Meine Frage dazu.. wie baue ich diesen Key in meiner Datenbank via PhpMyAdmin?

Zitat:
Kommt darauf an. Ist es ein MySQL-Problem, dann hier, ansonsten im PHP-Teil des Forums.
Dann werde ich dies eher in den Php-Teil posten..

Gruss
Prinzli
prinzli ist offline   Mit Zitat antworten
Alt 04.11.2007, 20:43  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.633
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo prinzli,

Zitat:
Meine Frage dazu.. wie baue ich diesen Key in meiner Datenbank via PhpMyAdmin?
Du legst in der Tabelle PROFIL einfach noch eine Spalte "BENUTZER_ID" oder wie auch immer du sie nennen möchtest an und dimensionierst diese wie den Primärschlüssel der Tabelle BENUTZER. Ich verwende für IDs meist int(5). Beim Einfügen in die Datenbank musst du nun die Benutzerdaten in die Tabelle BENUTZER einfügen, dir den Key holen und die Attribute in die Tabelle PROFIL einfügen, wobei BENUTZER_ID mit dieser gefüllt werden sollte. Damit hast du eine Fremdschlüsselbeziehung über die BENUTZER_ID zwischen den beiden Tabellen hergestellt. OK?
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 04.11.2007, 21:15  
Erfahrener Benutzer
 
Registriert seit: 21.10.2007
Beiträge: 120
prinzli
Standard

..hmm..

Also ich habe zwei Tabellen (bis jetzt.. hehe)
Code:
               Tabelle BENUTZER:

      -->    id | int(5) | auto_increment | primaryKey
    /        benutzername | varchar(200) 
   |         passwort | varchar(200) 
   |         vorname | varchar(200) 
   |         nachname | varchar(200) 
   |         email | varchar(200)
   |         land | varchar(200) 
   |
   |
   |           Tabelle BENUTZER_OPTIONEN
   |
    \         id | int(5)  auto_increment  | primaryKey            
      -->     benutzer_id  | int(5)             
              benutzername | varchar(200)   (den kann ich wohl löschen?!)     
              datum | text              
              webseite | varchar(150)
So veranschaulicht, dass die ID der Tabelle "Benutzer" in die Tabelle Benutzeroptionen eingetragen wird..

das wird via inserit und select gemeistert..?

Zitat:
Beim Einfügen in die Datenbank musst du nun die Benutzerdaten in die Tabelle BENUTZER einfügen, dir den Key holen und die Attribute in die Tabelle PROFIL einfügen, wobei BENUTZER_ID mit dieser gefüllt werden sollte.
Wenn ich das richtig verstehe, stelle ich eine Fremdschlüsselbeziehung per php-code her?

Vielen Dank..!
Gruss
Prinzli
prinzli ist offline   Mit Zitat antworten
Alt 05.11.2007, 00:17  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Jein. Die MySQL-Datenbankengine innoDB kann dir zumindest bei Änderungen Abhängigkeiten auflösen. Die Standard-Engine MyISAM kennt keine Verbindung unter Tabellen!

Das heißt (auf innoDB bezogen) löscht du den Eintrag aus "Benutzer", kann auch automatisch der Eintrag aus "Benutzer-Optionen" gelöscht werden. Dies geschieht durch die Definition der Tabellenstruktur (ON DELETE/UPDATE CASCADE). Macht Sinn, damit keine Benutzer-Optionen ohne Benutzer existieren.

Das kann natürlich auch böse Folgen haben. Ein Land aus einem unserer Projekte wurde einmal gelöscht, das hatte zur Folge, dass alle Bundesländer, Kreise, Städte und all ihre Karten auch gelöscht wurden. Die Datenbank war danach leer. Zumindest ist es konsequent.

Die Auswahl (SELECT) und Verknüpfung der Optionen zu ihrem Benutzer muss wie du richtig erkannt hast, selbst erfolgen. Das würde dann ganz einfach über

Code:
SELECT * FROM benutzer AS b LEFT JOIN benutzer_optionen AS o ON b.id = o.benutzer_id
erfolgen. Bei einer 1:1 Beziehung (ein Benutzer hat einen Optionseintrag und ein Optionseintrag ist genau einem Benutzer zugeordnet) ist es übrigens unnötig, der erweiterten Tabelle einen eigenen Primärschlüssel zuzuordnen, denn ein Eintrag der Tabelle "Benutzer_Optionen" wird ja bereits durch seine Benutzer_ID eindeutig identifiziert.

Würdest du die Tabelle "Benutzer_Optionen" so umstellen, könntest du folgenden kürzeren SQL-JOIN verwenden:

Code:
SELECT * FROM benutzer NATURAL JOIN benutzer_optionen
Hierbei würde die Verknüpfung implizit (selbsttätig) über den Primärschlüssel, die Benutzer_ID erfolgen.
Zergling-new ist offline   Mit Zitat antworten
Alt 05.11.2007, 17:59  
Erfahrener Benutzer
 
Registriert seit: 21.10.2007
Beiträge: 120
prinzli
Standard

Vielen Dank @Zegerling

Eine kurze Zwischenfrage:
Zitat:
SELECT * FROM benutzer AS b LEFT JOIN benutzer_optionen AS o ON b.id = o.benutzer_id
Kannst Du mir das "AS b" und AS o ON b" erklären.. ich meine die Bedeutung des "b" und "o ON b"..? Blicke da noch nicht ganz durch...

Herzlichen Dank!
Gruss Prinzli
prinzli ist offline   Mit Zitat antworten
Alt 05.11.2007, 18:12  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

AS ... definiert einfach ein Alias, um gerade bei JOINS nicht die langen Tabellennamen vor .Spaltenbeziechner schreiben zu müssen. Also bspw.

Code:
SELECT a.Name, a.Age, s.Title
FROM MP3_Artists AS a, 
JOIN MP3_Songs AS s
ON a.ID = b.ArtistID
statt
Code:
SELECT MP3_Artists.Name, MP3_Artists.Age, MP3_Songs.Title
FROM MP3_Artists
JOIN MP3_Songs
ON MP3_Artists.ID = MP3_Songs.ArtistID
nikosch 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
Left Join.. mit ON 2 Spalten holen? kleenerandi PHP Tipps 2008 0 31.03.2008 22:48
WHERE-Clause im Left Join cycap Datenbanken 2 06.11.2007 11:06
LEFT OUTER JOIN auf Nicht-Tabelle inu Datenbanken 15 29.03.2007 20:21
[solved] LEFT JOIN - #1066 - Not unique table/alias moose Datenbanken 6 12.12.2006 06:41
[gelöst] LEFT JOIN und trotzdem nicht alle Sätze da?!? stefanjann Datenbanken 3 24.10.2006 11:32
Problem mit Inner join Jabi Datenbanken 15 09.05.2006 14:10
Left outer join, timestamps php-newbie83 Datenbanken 29 27.04.2006 09:29
LEFT OUTER JOIN für mehr als 2 Tabellen ? Alpha Centauri Datenbanken 4 05.04.2006 16:18
Select Problem Datenbanken 17 16.01.2006 21:54
[Erledigt] LEFT JOIN Query Bildung Datenbanken 6 04.11.2005 15:24
[Erledigt] LEFT JOIN funtkioniert nicht richtig Datenbanken 3 19.10.2005 17:38
[Erledigt] LEFT JOIN Problem Datenbanken 11 21.03.2005 16:36
[Erledigt] Menülinks in Kategorien per Left join Datenbanken 20 14.03.2005 12:43
[Erledigt] left outer join mit bedingung Datenbanken 2 04.03.2005 00:52
den letzte(grösten) eintrag aus LEFT JOIN Datenbanken 2 24.07.2004 18:33

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sql join erklärung, mysql join erklärung, left join erklärung, join erklärung, sql joins erklärung, join sql erklärung, left join mysql erklärung, erklärung left join, mysql left join erklärung, erklärung sql join, mysql joins erklärung, erklärung join, join erklärung sql, mysql erklärung left join, join erklären, left join einfach erklärt, left join bedeutung, erklärung inner join, join mysql erklährung, sql erklärung joins

Alle Zeitangaben in WEZ +1. Es ist jetzt 04:28 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.