# Mysql abfrage über 2 tabellen.



## sengir45 (7. Dez 2007)

hallo habe ein problem mit meiner abfrage. hoffe ihr könnt mir helfen. 

Tabelle 1:
Artikeltabelle:
id 	name 	kategorie 
1        bla           3
2        bla           4


Tabelle2:
Hirachietabelle fuer kategorien:

id 	kat_name 	vater
1 	Autos 	             0
2 	Sportartikel 	   0
3 	VW 	             1
4       Opel                 1



so meine abfrage ist jetzt das ich alle ids aus tabelle1 haben will die die vater id 1 in tabelle 2 haben, wenn ich als parameter die übergeordnete kategorie id angebe.

also kategorie1 --> alle artikel die in kategorie 1 sind anzeigen.

abfrage bis jetzt : 



```
"SELECT * from artikel where id = (select id from kategorie where vater='"+k_id+"') order by id desc";
```

als fehlermeldung bekomme ich: Subquery returns more than 1 row
was ja auch berechtigt ist. weiss aber nicht wie ich das am besten aufschlüsseln kann. hat jemand ne idee ??

danke euch !!

lg


----------



## DP (7. Dez 2007)

select * from artikel, kategorie where artikel.id = kategorie.id and vater = x;


----------



## FenchelT (7. Dez 2007)

DP hat gesagt.:
			
		

> select * from artikel, kategorie where artikel.id = kategorie.id and vater = x;



Hallo,

koennte mir vorstellen, dass das Ergebnis ein wenig verwirrend wird, wenn Du den eindeutigen Schluessel der Tabelle Kategorie mit dem eindeutigen Schluessel der Tabelle Artikel joinst  :wink: 

@Gast

```
SELECT kategorie.*, artikel.*
FROM kategorie INNER JOIN artikel ON kategorie.id = artikel.kategorie
WHERE vater = x
```

ACHTUNG: Ein INNER JOIN liefert immer nur die Menge Datensaetze zurueck, die in beiden Tabellen vorhanden sind.
Solltest Du DS in Tabelle Kategorie haben, die keine Auspraegung in Tabelle Artikel haben
und diese auch ausgeben wolen, musst Du INNEr JOIN durch LEFT OUTER JOIN bzw RIGHTH OUTER JOIN ersetzen.

Gruesse


----------



## DP (7. Dez 2007)

sorry, meinte

select * from artikel, kategorie where artikel.id = kategorie.artikel_id and kategorie.vater = x;


----------



## Guest (8. Dez 2007)

erstmal vielen dan fuer eure hilfe. es klappen beide variationen wobei ich bei der ausgabe bei beiden das gleiche problem habe, bzw der gleiche"fehler" auftritt. es werden viele ids mit attributen doppelt ausgegeben. also abfrage sieht so aus :

"select * from auktionen, kategorie where auktionen.kategorie = kategorie.id and kategorie.vater = '"+k_id+"'"; 
 (bei der anderen abfrage sieht das ergebnis gleich aus)

tabellen mit inhalt:

Tabelle: auktionen

id 	name 	kategorie 	
93 	VW Golf  	3 	
95 	badehose       5 	
96 	golf 5 	 	  8 	
97 	golf gti 	  3 	
92 	Tennisschläger 	10
91 	mazda 		8 	



Tabelle: kategorie

id 	kat_name 	vater
1  	Autos  	             0
2 	Sportartikel 	   0
3 	VW 	             1
4 	opel 	  	      1
5 	Schwimmen 	2
7 	honda 	  	     1
8 	mazda 	  	    1
9 	porsche 	    1
10 	Tennis 	  	    2
11 	Basketball 	  2


so, wenn ich als parameter jetzt 1 eingebe fuer alle artikel die in autos drin sind bekomme ich folgendes ergebnis:

Art-Nr.: 93-Name: VW Golf//
Art-Nr.: 93-Name: VW Golf//
Art-Nr.: 96-Name: golf 5//
Art-Nr.: 93-Name: VW Golf//
Art-Nr.: 96-Name: golf 5//
Art-Nr.: 97-Name: golf gti//
Art-Nr.: 93-Name: VW Golf//
Art-Nr.: 96-Name: golf 5//
Art-Nr.: 97-Name: golf gti//
Art-Nr.: 91-Name: mazda//

also viele ergebnisse doppelt. 

eingabe: 2 fuer Sportartikel:
ausgabe:

Art-Nr.: 95-Name: badehose//
Art-Nr.: 95-Name: badehose//
Art-Nr.: 92-Name: Tennisschläger//

habt ihr noch ne idee ????

danke euch !!!


----------



## FenchelT (8. Dez 2007)

Hallo zusammen,

mache aus 

```
"select * from auktionen, kategorie where auktionen.kategorie = kategorie.id and kategorie.vater = '"+k_id+"'";
```


```
"select distinct * from auktionen, kategorie where auktionen.kategorie = kategorie.id and kategorie.vater = '"+k_id+"'";
```

EDITH:
Lies Dir bitte im Internet ein Tutorial bezgl SQL durch.
Das ist ein gut gemeinter Rat. Es ist nichts schlimmer als Daten auszuwerten und diese zu interpretieren und nicht zu wissen, wie diese zustandekommen, bzw wie sich das was ich an Befehlen einsetze, auf das Ergebnis auswirkt  :wink:


----------



## Guest (9. Dez 2007)

ehm.. danke aber mit distinct habe ich es ereits versucht. das klappt auch nicht. war auch mein erster gedanke und habe gehofft das es funktioniert. tut es aber leider nicht 

wär ja auch zu einfach gewesen.


danke


----------



## DP (9. Dez 2007)

select * from auktionen, kategorie where auktionen.kategorie = kategorie.id and kategorie.vater = '"+k_id+"'" group by auktionen.id; 

ist bei größeren tabellen auch schneller als distinct.


----------



## FenchelT (10. Dez 2007)

DP hat gesagt.:
			
		

> select * from auktionen, kategorie where auktionen.kategorie = kategorie.id and kategorie.vater = '"+k_id+"'" group by auktionen.id;
> 
> ist bei größeren tabellen auch schneller als distinct.




Moin DP,

das ist aber wieder die mySQL-eigene Interpretation des GROUP BY.
Auch wenn es zum Ziel fuehren mag, macht es keinen Sinn. 

Aus beiden Tabellen alle Felder zu selektieren und dann nur auf ein Feld zu gruppieren ist nicht wirklich im Sinne des GROUP BY

Gruesse und einen schoenen Start in die Woche


----------



## Guest (10. Dez 2007)

hmm... das geht irgendwie auch nicht.
ich weiss nicht wieso..  bekomme immer einige ausgaben doppelt.. weiss jmd woran das liegen kann ?

das es nicht performant oder sinnig ist lasse ich mal dahingestellt. muss es nur bis donnerstag fertig haben. und da sollte es erstmal laufen--- egal wie 

hoffe ihr habt noch weitere vorschläge.. 

vielen dank !!


----------



## Guest (10. Dez 2007)

k-- fehler gefunden.. es läuft. vielen dank euch allen !!!


----------

