- Ad -
php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Thema geschlossen
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 28-10-2003, 11:57
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Lightbulb JOINS - das leidige Thema

weil hier immer so viel fragen zu joins und zu erklärenden beispiel kommen, hab ich mich in meiner grenzenlosen güte mal hingesetzt und was zusammengeflickt

die SELECT-Statements einfach mal ausprobieren und schauen was rauskommt, ich denke, ich hab so ziemlich jeden Fall abgedeckt

tabellen
Code:
CREATE TABLE tabelle1 (
  tab1_id int(11) NOT NULL auto_increment,
  zahl int(11) NOT NULL default '0',
  PRIMARY KEY  (tab1_id)
) TYPE=MyISAM;

INSERT INTO tabelle1 VALUES (1, 1),
(2, 2),
(3, 4),
(4, 8);

CREATE TABLE tabelle2 (
  tab2_id int(11) NOT NULL auto_increment,
  tab1_id int(11) default '0',
  quadrat int(11) NOT NULL default '0',
  PRIMARY KEY  (tab2_id)
) TYPE=MyISAM;

INSERT INTO tabelle2 VALUES (1, 2, 4),
(2, 3, 16),
(3, 4, 64),
(4, NULL, 256);
SELECT-Statements

zahl und quadrat auslesen:
Code:
SELECT
	t1.zahl, t2.quadrat
FROM
	tabelle1 t1
	INNER JOIN tabelle2 t2 USING(tab1_id)

# alternativ
# so können auch mehrere bedingungen angegeben werden
# syntax is mit der bei WHERE identisch

SELECT
	t1.zahl, t2.quadrat
FROM
	tabelle1 t1
	INNER JOIN tabelle2 t2 ON t1.tab1_id = t2.tab1_id

# mit ON können auch spalten verglichen werden, deren namen nicht gleich sind
# aber schon allein der übersichtlichkeit halber wären identische spaltennamen besser
# sinnloses beispiel:
SELECT
	t1.zahl, t2.quadrat
FROM
	tabelle1 t1
	INNER JOIN tabelle2 t2 ON t1.tab1_id = t2.tab2_id
alle zahlen auslesen und das quadrat dazu, sofern vorhanden
Code:
SELECT
	t1.zahl, t2.quadrat
FROM
	tabelle1 t1
	LEFT JOIN tabelle2 t2 USING(tab1_id)
alle quadrate auslesen und die wurzel dazu, sofern vorhanden
Code:
SELECT
	t1.zahl, t2.quadrat
FROM
	tabelle1 t1
	RIGHT JOIN tabelle2 t2 USING(tab1_id)

##selbstverständlich geht auch das:

SELECT
	t1.zahl, t2.quadrat
FROM
	tabelle2 t2
	LEFT JOIN tabelle1 t1 USING(tab1_id)
alle zahlen auslesen, zu denen das quadrat nicht vorhanden ist
Code:
SELECT
	t1.zahl
FROM
	tabelle1 t1
	LEFT JOIN tabelle2 t2 USING(tab1_id)
WHERE
	t2.tab1_id IS NULL
alle quadrate auslesen, zu denen die wurzel nicht vorhanden ist
Code:
SELECT
	t2.quadrat
FROM
	tabelle1 t1
	RIGHT JOIN tabelle2 t2 USING(tab1_id)
WHERE
	t1.tab1_id IS NULL
__________________
Ich denke, also bin ich. - Einige sind trotzdem...

Geändert von mrhappiness (29-10-2003 um 10:42 Uhr)
  #2 (permalink)  
Alt 29-10-2003, 08:53
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard Nachtrag

Und noch ein Beispiel, dann is wirklich Schluss (sag ich jetzt einfach so )
Code:
CREATE TABLE tabelle3 (
  tab3_id int(11) NOT NULL auto_increment,
  tab1_id int(11) default '0',
  kubik int(11) NOT NULL default '0',
  PRIMARY KEY  (tab3_id)
) TYPE=MyISAM;

INSERT INTO tabelle3 VALUES (1, 1, 1),
(2, 2, 8),
(3, 3, 64);
zahl und zahl² und/oder zahl³ liefern, sofern vorhanden
Code:
SELECT
	t1.zahl,
	t2.quadrat,
	t3.kubik
FROM
	tabelle2 t2
	RIGHT JOIN tabelle1 t1 ON t2.tab1_id=t1.tab1_id
		LEFT JOIN tabelle3 t3 ON t1.tab1_id=t3.tab1_id
bei noch mehr tabellen geht's analog

mann sollte sich nur überlegen, welche tabelle man wo hinschreibt, hier steht tabelle1 in der mitte, da ich sie zweimal brauche
hätte ich mittabelle1 angefangen, hätte ich sie zweimal verwenden müssen, was ja nicht unbedingt sein muss
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
  #3 (permalink)  
Alt 15-12-2003, 17:38
timepoint5
 Member
Links : Onlinestatus : timepoint5 ist offline
Registriert seit: Jan 2003
Ort: _root
Beiträge: 454
timepoint5 ist zur Zeit noch ein unbeschriebenes Blatt
Thumbs up

Awsome Happy!
Gestern hat mich jemand dannach gefragt, werd gleich mal den link weiter geben.

Thanks!
__________________
Möglich ist alles!
  #4 (permalink)  
Alt 13-01-2004, 10:55
flobee
 Newbie
Links : Onlinestatus : flobee ist offline
Registriert seit: Jan 2004
Beiträge: 15
flobee ist zur Zeit noch ein unbeschriebenes Blatt
flobee eine Nachricht über ICQ schicken
Standard

cool!

ich habe diese seite als nach schlag: http://www.little-idiot.de/mysql/mysql-118.html
  #5 (permalink)  
Alt 21-01-2004, 13:52
invitatoinvitat
 Junior Member
Links : Onlinestatus : invitatoinvitat ist offline
Registriert seit: May 2003
Beiträge: 133
invitatoinvitat ist zur Zeit noch ein unbeschriebenes Blatt
Standard

was ich mich schon immer fragte, was ist der unterschied zu:

Code:
SELECT t1.t1_id,t2.t2_id FROM table1 as t1, table2 as t2 WHERE t2.t1_id = t1.t1_id
  #6 (permalink)  
Alt 21-01-2004, 14:16
flobee
 Newbie
Links : Onlinestatus : flobee ist offline
Registriert seit: Jan 2004
Beiträge: 15
flobee ist zur Zeit noch ein unbeschriebenes Blatt
flobee eine Nachricht über ICQ schicken
Standard

das steht bei meinem link sehr genau! performance!
  #7 (permalink)  
Alt 21-01-2004, 23:25
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

@invitatoinvitat
stell dir einfach vor, dass die datenbank bei dir das karthesische produkt der tabellen bildet, also jede zeile aus tabelle1 mit jeder zeile aus tabelle2 verknüpft und danach diese ergebnismenge durchgeht und datensätze, die die bedingung nicht erfüllen nachträglich rausschmeißt

kommt zwar nicht ganz hin, aber vom prinzip her sollte es klar sein
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
  #8 (permalink)  
Alt 22-01-2004, 00:04
flobee
 Newbie
Links : Onlinestatus : flobee ist offline
Registriert seit: Jan 2004
Beiträge: 15
flobee ist zur Zeit noch ein unbeschriebenes Blatt
flobee eine Nachricht über ICQ schicken
Standard

genau, und weil das
SELECT t1.t1_id,t2.t2_id FROM table1 as t1, table2 as t2 WHERE t2.t1_id = t1.t1_id
alle zeilen betrifft macht man erst einen join um sie auf die relevanten ids zuerst zu reduzieren. speed machen
umgekehrt hat man dardurch auch die möglichkeit nicht existtierende gegenstücke der anderen tabelle zu ermittel (wo gibt es keine paare).. und das kannst du mit dem query oben nicht.
bei kleinen tabellen ist das eigentl egal. wenn du aber ein paar tausend einträge hast unterscheidet sich die abfrage geschwindigkeit erheblich (unterschiede im sec. bereich anstelle von ein paar millisekunden!)
  #9 (permalink)  
Alt 22-01-2004, 00:37
goth
  Moderator
Links : Onlinestatus : goth ist offline
Registriert seit: Mar 2002
Ort: Erde
Beiträge: 7.266
goth ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von mrhappiness
@invitatoinvitat
stell dir einfach vor, dass die datenbank bei dir das karthesische produkt der tabellen bildet, also jede zeile aus tabelle1 mit jeder zeile aus tabelle2 verknüpft und danach diese ergebnismenge durchgeht und datensätze, die die bedingung nicht erfüllen nachträglich rausschmeißt

kommt zwar nicht ganz hin, aber vom prinzip her sollte es klar sein
Naja ... das ist allerdings auch mehr ein Produkt aus Theorie ... und dem was die Spinner bei little-idiot schreiben ... moderne Datenbank optimieren durchaus etwas mehr ... !

Wobei der EQUI-Join meist definitiv langsamer ist als ein LEFT JOIN ... möglicherweise liefert dieser jedoch nicht die gewünschten Ergebnisse ... (insbesondere beim aggregieren).
__________________
carpe noctem

Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht!
Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung!

Geändert von goth (22-01-2004 um 00:44 Uhr)
  #10 (permalink)  
Alt 23-01-2004, 08:27
invitatoinvitat
 Junior Member
Links : Onlinestatus : invitatoinvitat ist offline
Registriert seit: May 2003
Beiträge: 133
invitatoinvitat ist zur Zeit noch ein unbeschriebenes Blatt
Standard

oho :-O
danke für die auskünfte, ich beschäftige mich derzeit nämlich mit der optimierung meiner community, da sie bei knapp 70 gleichzeitigen usern merklich langsamer wird, da sind ziemlich viele solcher verknüpften abfragen drin, die auf tabellen mit über 50.000 datensätzen zugreifen
  #11 (permalink)  
Alt 28-08-2006, 11:47
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.234
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zwei weitere gute Einführungen ins Thema JOINs bei SELFHTML:

Einführung in Joins
Fortgeschrittene Jointechniken
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Thema geschlossen

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

Zeit ist Geld, PC einfach selbst reparieren!
Zeit ist Geld, PC einfach selbst reparieren!Wenn der PC nicht richtig läuft, wirft sie das in Ihrem Arbeitsalltag meist zurück. Dabei können Sie einige Probleme mit relativ wenig Aufwand und ohne intime Kenntnisse Ihres Rechners selbst lösene

18.04.2016 | Berni

Die wichtigsten Rahmenbedingungen für das Hosting
Die wichtigsten Rahmenbedingungen für das HostingGuter Webspace wird in der heutigen Zeit immer wichtiger. Die Scripte werden moderner und fordern höhere Leistung, der allgemeine Traffic im Internet nimmt zu.

17.08.2015 | Berni


 

Aktuelle PHP Scripte

Feiertage

PHP Klasse die eine Liste der deutschen Feiertage erzeugt

23.09.2016 rjentsch | Kategorie: PHP/ Management
EJS TreeGrid ansehen EJS TreeGrid

EJS TreeGrid is DHTML component written in pure JavaScript to display and edit data in table, grid, tree view or grid with tree on HTML page

20.09.2016 coqsoft@ | Kategorie: JAVASCRIPT/ Components
Admidio Mitgliederverwaltung

Admidio ist eine kostenlose Online-Mitgliederverwaltung, die für Vereine, Gruppen und Organisationen optimiert ist. Sie besteht neben der Mitgliederverwaltung aus einer Vielzahl an Modulen (Foto-, Download-, Terminverwaltung), die in eine neue oder besteh

14.09.2016 webmaster52@ | Kategorie: PHP/ Groupware
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:05 Uhr.