# MYSQL join haupt mit mehreren subtables bei versch. anzahl von subtable einträgen



## quarkfrosch (7. Oktober 2004)

*MYSQL JOIN <:> haupt mit mehreren subtables bei versch. anzahl von subtable einträgen*

ok ich habe folgendes problem

ich habe 4 tabellen die ich wie folgt joinen möchte main,sub1,sub2,sub3


```
table main:

id 	name 		blubb 	
1	mainentry 1 	jaha	
2	mainentry 2 	juhu	
3	mainentry 3 	joho	
4	mainentry 4	         hehe	
5	mainentry 5 	jodilo	
6	mainentry 6 	juhuhuhu

table sub1 
id 	main_id 	name 	
1	1		sub1->main1	
2	1		sub1->main1	
3	2		sub1->main2

table sub2
id 	main_id 	name 	
1	1		sub2->main3

table sub3
id 	main_id 	name 	
1	4		sub3->main4
2	0		sub3->nomain
```
wie man sieht gibt es 3 verschiedene zustände

1. 1 result z.b. main.id = 2 && sub1.main.id = 2
2. mehr als 1 result z.b. main.id = 1 && sub1.main_id = 1 (reihe 1,2 of table sub1)
3. kein result z.b main.id = 5|6 or main.id = ""


ich hatte folgendes versucht:

```
mysql>
SELECT main.id, main.name, main.blubb, sub1.id AS sub1id, sub1.name AS sub1name, sub2.id AS sub2id, sub2.name AS sub2name, sub3.id AS sub3id, sub3.name AS sub3name
FROM main, sub1, sub2, sub3
WHERE 1 AND sub1.main_id = main.id AND sub2.main_id = main.id AND sub3.main_id = main.id
GROUP BY main.id
result> keins
```

ich bekomme kein result weil ja nicht alle subs 1 main zugeordnet sind
hier der versuch mit OR

```
mysql>
SELECT main.id, main.name, main.blubb, sub1.id AS sub1id, sub1.name AS sub1name, sub2.id AS sub2id, sub2.name AS sub2name, sub3.id AS sub3id, sub3.name AS sub3name
FROM main, sub1, sub2, sub3
WHERE 1 OR sub1.main_id = main.id OR sub2.main_id = main.id OR sub3.main_id = main.id
GROUP BY main.id

result > 
id 	name 		blubb 		sub1id 	sub1name 	sub2id 	sub2name 	sub3id 	sub3name 	
1	mainentry 1	jaha		1	sub1->main1	1	sub2->main3	1	sub1->main4	
2	mainentry 2	juhu		1	sub1->main1	1	sub2->main3	1	sub1->main4	
3	mainentry 3	joho		1	sub1->main1	1	sub2->main3	1	sub1->main4	
4	mainentry 4	hehe		1	sub1->main1	1	sub2->main3	1	sub1->main4	
5	mainentry 5	jodilo		1	sub1->main1	1	sub2->main3	1	sub1->main4	
6	mainentry 6	juhuhuhu	1	sub1->main1	1	sub2->main3	1	sub1->main4
```
wie man sieht gibt er zwar ein result aus füllt auch subfelder aus aber in allen reihen die selben werte und so wollte ich das net
ich bräuchte ein result wie das hier >


```
id 	name 		blubb		sub1id		sub1name	sub2id		sub2name	sub3id		sub3name
1	mainentry 1	jaha		1		sub1->main1	NULL		NULL		NULL		NULL
2	mainentry 2	juhu		3		sub1->main2	NULL		NULL		NULL		NULL
3	mainentry 3	joho		NULL		NULL		1		sub2->main	NULL		NULL
4	mainentry 4	hehe		NULL		NULL		NULL		NULL		1		sub3->main4
5	mainentry 5	jodilo		NULL		NULL		NULL		NULL		NULL		NULL
6	mainentry 6	juhuhuhu	NULL		NULL		NULL		NULL		NULL
```

hier der SQL dump für die dies testen wollen...

```
CREATE TABLE `main` (
  `id` int(5) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL default '',
  `blubb` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=7 ;

CREATE TABLE `sub1` (
  `id` int(5) NOT NULL auto_increment,
  `main_id` int(5) NOT NULL default '0',
  `name` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=4 ;

CREATE TABLE `sub2` (
  `id` int(5) NOT NULL auto_increment,
  `main_id` int(5) NOT NULL default '0',
  `name` varchar(55) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=2 ;

CREATE TABLE `sub3` (
  `id` int(5) NOT NULL auto_increment,
  `main_id` int(5) NOT NULL default '0',
  `name` varchar(50) NOT NULL default '',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=4 ;



INSERT INTO `main` VALUES (1, 'mainentry 1', 'jaha');
INSERT INTO `main` VALUES (2, 'mainentry 2', 'juhu');
INSERT INTO `main` VALUES (3, 'mainentry 3', 'joho');
INSERT INTO `main` VALUES (4, 'mainentry 4', 'hehe');
INSERT INTO `main` VALUES (5, 'mainentry 5', 'jodilo');
INSERT INTO `main` VALUES (6, 'mainentry 6', 'juhuhuhu');

INSERT INTO `sub1` VALUES (1, 1, 'sub1->main1');
INSERT INTO `sub1` VALUES (2, 1, 'sub1->main1');
INSERT INTO `sub1` VALUES (3, 2, 'sub1->main2');

INSERT INTO `sub2` VALUES (1, 1, 'sub2->main3');

INSERT INTO `sub3` VALUES (1, 4, 'sub1->main4');
```


----------



## Gorcky (7. Oktober 2004)

*Re: MYSQL JOIN <:> haupt mit mehreren subtables bei versch. anzahl von subtable einträgen*

Also ich find das nicht gerade übersichtlich...   
Was genau steckt denn (fachlich/technisch) dahinter?
Ich kann mir unter diesen entfremdeten Daten (fast) ohne Beschreibung nicht wirklich was vorstellen.


----------



## quarkfrosch (7. Oktober 2004)

hab mich noch mal hingesetzt

nun das
ganze mit echten daten ... z.t. sind es noch platzhalter

Tabelle Projekte (Main oder Haupttabelle) 
inahlte sind Projektbeschreibung und sowas... also was auf jedes projekt zutrifft....

```
Feld		Typ			Null		
id  		bigint(11)		Nein 	 	 	 	 	
typ  		enum('film', 'website')	Nein 	 	 	 	 	
headline  	varchar(255)		Nein 	 	 	 	 	
teamname  	varchar(255)		Nein 	 	 	 	 	
shorttext  	tinytext		Nein 	 	 	 	 	
text  		text			Nein
```
tabelle projekte_film 
Daten für einen Film wenn das Projekt ein Film ist

```
Feld		Typ		Null	
id  		bigint(11)	Nein 		 	 	 	
projekte_id  	bigint(11)	Nein 	 	 	 	 	
name  		varchar(255)	Nein 	 	 	 	 	
details  	mediumtext	Nein 	 	 	 	 	
status  	enum('1', '2', '3', '4', '5', '6')	Nein 	1 	 	 	 	
vorschau  	varchar(50)	Nein
```
tabelle projekte_tagebuch
Die Einträge für das Filmtagebuch kommen Hier rein 

```
Feld		Typ		Null	
id  		bigint(11)	Nein 	 	 	 	 	
projekte_id  	bigint(11)	Nein 	 	 	 	 	
headline  	varchar(255)	Nein 	 	 	 	 	
date  		varchar(10)	Nein 	 	 	 	 	
text  		text		Nein
```
Tabelle projekte_team
Hier Stehen die Teammitglieder drin die dran teilgenommen haben ...
die namen holt er sich aus der tabelle team aber dasis ne andre geschichte...

```
Feld		Typ		Null	
id  		bigint(11)	Nein 	 	 	 	 	
projekte_id  	bigint(11)	Nein 	 	 	 	 	
team_id  	bigint(11)	Nein 	 	 	 	 	
Aufgabe  	varchar(255)	Nein 	 	 	 	 	
sonst  		varchar(50)	Nein
```

so schaun die tabellen aus ... nun hätte ich gerne Folgende seite
Wenn ich auf Das Adminscript gehe möchte ich wenn er auf die Projekte Tabelle klickt das
die spalten projekte(id,typ,headline,teamname,shorttext,text)
auswählt UND wenn er ein film, tagebuch, Website oder Team eintrag in der jeweiligen tabelle findet das er dann eine art spalte team website etc. macht(per join)
und wenn er was gefunden hat in der andren tabelle zur projekte.id dann soll er die team/website.... .id angeben ansonsten soll er leer lassen

d.h. 
    	in tabelle projekte is ein eintrag mit id = 1.
	in tabelle film ist ein eintrag mit projekte_id = 1
	also würden die per alias benannte spalten film  den wert des gefunden untertabellen.id haben
	die er findet 
	wenn jetzt projekt.id = 1 keine website gefunden wurde soll die alias spalte website leer also NULL sein
	bei team sind z.b. 3 Teammitglieder und bei Tagebuch 2 einträge vorhanden also soll er im alias Team sowie in Tagebuch
	den wert des ersten oder letzen gefunden werts haben


und da mehr als 1 projekt da is soll er das halt für jedes projekt abfragen,
so das ich in php mit einer abfrage realisieren kann ob in den untertabellen inhalte verknüpft sind oder nicht ...
und je nach dem nen rotes oder grünes icon darstellen kann.


hier mal anhand eines beispiels
Tabelle Projekte

```
id 	typ 	headline 	teamname 			shorttext 					text 	
1	film	Projekt1	Team von Projekt1		Lorem ipsum dolor sit amet, consectetuer	Lorem                                                                         ipsum dolor sit amet, consectetuer	
								adipisci...
```
Tabelle Film

```
id 	projekte_id 	name 			details 			status 			vorschau 		
3	6		Film von Projekt 1	Film so und so 
						25 Minuten S/W...		Abgeschlossen 2001	Projekt1_film.wmv
```
Tabelle tagebuch

```
id 	projekte_id   	headline 	date 		text 	
2	1		Februar 2004	1096434543	Blah wir waren da und da ....	
3	1		20 März 2004	1096435515	und an diesem tag waren wir da und da ...
```
Tabelle Team

```
id   	projekte_id 	team_id 	Aufgabe 	 	
1	1		1		Aufgabe 1, Aufgabe 2	 	
2	1		2		Aufgabe 3, Aufgabe 4
```
so aus diesen 4 tabellen und deren inhalten soll eine übersicht wie Hier 
enstehen.

```
id 	typ 		headline 	teamname 	shorttext 	text		Film 		Website		tagebuch	team	
1	[TypIcon]	Projekt1	[GrünIcon]	[GrünIcon]	[GrünIcon]	[GrünIcon][3]	[RotIcon]	[GrünIcon]	[GrünIcon]
```
die verarbeitung und was daraus gemacht werden soll is net das prob
nur das er a WHERE tabelle.projekte_id = projekte.id macht und das für alle spalten unabhängig
und trotzdem die Zeile ausgibt auch wenn nicht alle where bedingungen also nicht alle untertabellen einen eintrag zum projekt habe er trotzdem die werte angibt
hab ich net hinbekommen ...

ich hoffe es ist jetzt einigermassen verständlich 
weil sonst müsste man im admin script jede tabelle durchklicken und schaun ob denn diesem oder jenem projekt denn was zugeordnet ist ..

also noch mal die fallerklärung

tabelle team,tagebuch können einen,keinen oder mehrere einträge zu einem projekt haben
tabelle websites und film können 1 oder keine eintrag zu einem projekt haben
das sql query was ich brauche soll ermittelbar machen zu welchem projekt in welcher tabelle inhalt ist oder kein inhalt zu diesem projekt....


----------

