Mysql group

Liebe/-r Experte/-in,
ich ahbe eine Frage zu mysql. Kann ich Abfragen über mehrere Tabellen machen, wobei ich aus einer Tabelle mehrere Werte brauche?

Beispiel:

Ich habe 5 Tabellen:
stereoanagen
hersteller
verstaerker
dvdspieler
boxen
id ist natürlich in allen drin und pk und ai.

In Hersteller stehen die Firmennamen, die Webseiten, Ansprechpartner usw. drin.

In DVDspieler verschiedene Datensätze wie
hersteller_id, formate,farbe usw.

In Verstaerker habe ich leistung, klirrfaktor,hersteller_id,farbe

In der Tabelle boxen habe ich hersteller_id, leistung.farbe,groesse usw.

In Stereroanlagen haben ich eine Zusammenstellung der Komponenten.

dvdplayer_id,boxen_id,verstaerker_id, usw.

Nun möchte ich eine Übersicht der zusammengestellten Anlage haben.

Wenn ich nun:

select dvdplayer.\*,verstaerker.\*,boxen.\*,hersteller.firmenname from hersteller,verstaerker,boxen,dvdplayer where stereoanlage.id=1 and verstaerker.hersteller\_id=hersteller.id and dvdplayer.hersteller\_id=hersteller.id and boxen.hersteller\_id=hersteller.id  

abfrage kann es nur schief gehen, da mysql so nicht weiss und ich dann auch nicht welcher firmenname wo zu gehört. Ich möchte sowas rausbekommen wie:
Stereoanlage Home
Verstärker ->Hersteller: Techniks
Verstärker ->Leistung: 500

DVD Player->Hersteller: Aiwa
DVD Player ->Formate: mp3,jpg

Boxen-> Hersteller: MAgnat
Leistung: 1000
Ist group vbiellicht irgendwie das zauberwort?

Danke für eure Mühe!
Oliver

Hallo Oliver,

ausschlaggebend dürfte der Aufbau der Tabelle stereoanlage(n?!?) sein. was für Felder sind da genau drin?

VG Dirk

Hallo Oliver,

ich möchte dir jetzt nicht die komplette Lösung vorschreiben. Aber was du brauchst sind joins.

Eine Anleitung ist hier zu finden:
http://dev.mysql.com/doc/refman/5.1/de/join.html

Solltest dich nach dem durchlesen nicht auskennen kannst dich gerne noch mal melden.

Lg

Hallo,

was spricht dagegen wenn du die einzelnen Komponenten einer Stereoanlage einzeln abrufst?

Also ungefähr so:

SELECT d.format, h.firmenname
FROM dvdplayer d, hersteller h
WHERE d.hersteller_id = h.id

und das jetzt für Dvd-Player, Verstärker usw.

Moin Oliver,

ich ahbe eine Frage zu mysql. Kann ich Abfragen über mehrere
Tabellen machen, wobei ich aus einer Tabelle mehrere Werte
brauche?

Beispiel:

Ich habe 5 Tabellen:
stereoanagen
hersteller
verstaerker
dvdspieler
boxen
id ist natürlich in allen drin und pk und ai.

In Hersteller stehen die Firmennamen, die Webseiten,
Ansprechpartner usw. drin.

In DVDspieler verschiedene Datensätze wie
hersteller_id, formate,farbe usw.

In Verstaerker habe ich leistung,
klirrfaktor,hersteller_id,farbe

In der Tabelle boxen habe ich hersteller_id,
leistung.farbe,groesse usw.

In Stereroanlagen haben ich eine Zusammenstellung der
Komponenten.

dvdplayer_id,boxen_id,verstaerker_id, usw.

Nun möchte ich eine Übersicht der zusammengestellten Anlage
haben.

Wenn ich nun:

select dvdplayer.\*,verstaerker.\*,boxen.\*,hersteller.firmenname  
> from hersteller,verstaerker,boxen,dvdplayer where  
> stereoanlage.id=1 and verstaerker.hersteller\_id=hersteller.id  
> and dvdplayer.hersteller\_id=hersteller.id and  
> boxen.hersteller\_id=hersteller.id  

abfrage kann es nur schief gehen, da mysql so nicht weiss und
ich dann auch nicht welcher firmenname wo zu gehört. Ich
möchte sowas rausbekommen wie:
Stereoanlage Home
Verstärker ->Hersteller: Techniks
Verstärker ->Leistung: 500

DVD Player->Hersteller: Aiwa
DVD Player ->Formate: mp3,jpg

Boxen-> Hersteller: MAgnat
Leistung: 1000
Ist group vbiellicht irgendwie das zauberwort?

Ich verstehe das Problem nicht ganz - kannst du mal ein Abfrageergebnis schicken und dazu sagen, was deiner Meinung nach anders aussehen sollte? Wobei die Abfrage in der Form nicht funktionieren wird, du verwendest ein Feld (stereoanlage.id), für das gar nicht die Tabelle abgefragt wird.

Gruß

  • Silke -

Hi Dirk,

das war schnell. Danke!
In der tabelle Stereoanlagen sind neben dem schlüssel nur die Ids der Bausteine drin und der preis.

Also
id(key)
dvd_player_id
verstaerker_id
boxen_id
preis

Danke.
Auch das war sehr schnell. Waow. join…
Ich schau mal rein.

SELECT \* FROM   
hersteller,verstaerker,boxen,dvdplayer, stereoanlage   
WHERE  
stereoanlage.id=1   
AND  
verstaerker.id=stereoanlagen.verstaerker\_id  
AND  
dvdplayer.id=stereoanlagen.dvd\_player\_id  
AND   
boxen.id=stereoanlagen.boxen\_id  

würde ich mal probieren, sofern ich Dein Problem richtig verstanden habe. Rufst Du das über PHP ab? Dann würde ich ggf. mehrere Abfragen machen, da Du in unterschiedlichen Tabellen teilweise gleiche Labels benutzt und dadurch leicht die Übersicht verloren gehen könnte.

VG Dirk

Hallo Silke,
das ist superschnell! Danke.

Also, ich versuche es mal zu verdeutlichen:
Tabelle Stereoanlagen:

id(key)
dvd_player_id
verstaerker_id
boxen_id
preis

In DVDspieler
id(key)
hersteller_id
formate
farbe

In Verstaerker:
id(key)
leistung,
klirrfaktor
hersteller_id
farbe

Rauskommen soll
DVDPlayerhersteller
Verstärkerhersteller
Boxenhersteller usw.
Also brauche ich 3x Inhalte aus der Tabelle Hersteller
(where dvdplayer.hersteller_id=hesteller.id,verstaerker.hersteller_id=hesteller.id,boxen.hersteller_id=hesteller.id

Ein Hinweis ist join…

Ixch hoffe nun ists klarer geworden? Sind halt jeweils Abfragen über 3 tabellen.

Hi,

danke für die superschnelle Antwort. Hm, 3 einzelne Abfragen? Ginge natürlich auch. Ist aber doch nicht ganz so schön, oder?

Alternativ:

SELECT d.format, d.modell, v.modell, v.leistung, h1.firmenname AS dvd_fname, h2.firmenname AS v_fname, s.name
FROM dvdplayer d, hersteller h1, verstaerker v, hersteller h2, stereoanlage s
WHERE
d.hersteller_id = h1.id AND
v.hersteller_id = h2.id AND
s.dvdplayer_id = d.id AND
s.verstaerker_id = v.id

Allerdings finde ich die Lösung mit den einzelabfragen nicht unschön, es kommt auf die Implementierung an.

Hallo Oliver

Ich nehme an (so wie ich Deine Frage verstehe), dass in Deiner Query noch die
Tabelle „stereoanlagen“ fehlt? Die wäre ja so quasi der Ausgangspunkt der Query?

So dass Du quasi diese Query wolltest (mit „modernerer“ JOIN-Syntax), noch ohne
die Hersteller:

SELECT …
FROM stereoanlagen
INNER JOIN verstaerker
ON stereoanlagen.verstaerker_id = verstaerker.id
INNER JOIN dvdplayer
ON stereoanlagen.dvdplayer_id = dvdplayer.id
… (dito für Boxen und was immer)

Du könntest nun die Tabelle Hersteller mehrfach dazu JOINen, für jeden Objekt-
Type, sie benötigt dann jeweils einen eigenen Alias-Namen:

SELECT …
FROM stereoanlagen
INNER JOIN verstaerker
ON stereoanlagen.verstaerker_id = verstaerker.id
INNER JOIN hersteller AS verstaerker_hersteller
ON verstaerker.hersteller_id = verstaerker_hersteller.id
INNER JOIN dvdplayer
ON stereoanlagen.dvdplayer_id = dvdplayer.id
INNER JOIN hersteller AS dvdplayer_hersteller
ON dvdplayer.hersteller_id = dvdplayer_hersteller.id
… (dito für Boxen und was immer)

Das wäre wohl so etwas, was Du suchst? GROUP BY hilft Dir, so wie ich Deine
Frage verstehe, sicher nicht.

Beste Grüsse

Ah, du möchtest also Informationen über drei verschiedene Geräte aus den jeweils selben Tabellen holen. Ich würde es für am Sinnvollsten halten, das tatsächlich in drei Abfragen zu machen - was spricht dagegen?

Oha. Danke:
h1.firmenname AS dvd_fname, h2.firmenname FROM dvdplayer d, hersteller h1, verstaerker v, hersteller h2

Gibts dafür nen Namen. Ist das sowas wie ein Alias? Die Tabellen h1 und h2 sind, wenn ich es verstanden habe, sowas wie eine „künstliche“ Tabelle?

Danke! Oha. Ist glaube ich was für in neuer frische morgen früh!

Hallo,

also nach einem Blick auf deine Homepage solltest du eigentlich die Fragen selbst beantworten können.
Aber ok.

ich ahbe eine Frage zu mysql. Kann ich Abfragen über mehrere
Tabellen machen, wobei ich aus einer Tabelle mehrere Werte
brauche?

Grundsätzlich ja.
Irgendwo muss jedoch stehen, was in einer Anlage alles drin sein soll.
Also benötigst du eine Haupttabelle. Darin enthalten sind Spalten für die Verknüpfung mit den anderen Tabellen. Also wenn in der DVD-Player-Tabelle ein Player mit der ID 17 drinsteht, dann muss der in der Haupttabelle in der Spalte DVD auch mit 17 eingetragen sein.
Das Geheimnis dahinter nennt sich Entity-Relationship-Modell oder kurz ERM. Da definiert die Beziehungen zwischen verschiedenen Tabellen.
Die Ausgabe erfolgt dann mitunter nur mit einer Abfrage, bei der die Tabellen mit dem SQL-Befehl JOIN verbunden sind.

Um das hier aller erkären zu können, müßte ich anfangen ein Buch zu schreiben :smile:)
Du solltest dich ein wenig im Internet schlau machen über: ER-modell, Tabellenbeziehungen, SQL Syntax mit JOIN, Normalformen bzw. 2+3. Normalform.

Probier mal den: http://www.tecchannel.de/server/sql/1744994/business…

Wenn du damit einigermaßen durch bist, fängst du an deine Tabellen bzw. deine datenbank neu zu medellieren.
Einfach so ein paar Tabellen anlegen und dann abfragen läuft nicht. Da steckt in jedem Falle eine tiefere Logik dahinter, wie bei allen Dingen in der Programmierung.

Ich hoffe, das regt mal eine wenig an.
In welcher Fachrichtung hast du denn deinen MCP gemacht ?

Gruß
Proteus

Mit ‚As‘ kannst du eine Spalte umbenennen. Die Tabellen h1 und h2 sind einfach eine Abkürzung die man nach dem bekannt machen der Tabelle anhängen kann.

Hallo ,
danke für die schnelle Antwort.

So grün bin ich ja nun auch nicht mehr. Nur gehöre ich leider nicht den Leuten die alles wissen und nichts mehr wissen wollen. :wink: Natürlich kann ich auch 5 einzelne Abfragen machen, aber man will ja auch weiter kommen. :wink:

Der MCP war mal in NT4, der CNE in NW 5.

ER ist klar.
Also:
Die Tabelle Stereoanlagen enthält (fast) nur die ids der Geräte. Sie ist so zu sagen das zentrum. Dort werden die zusammengestellen pakete „verwaltet“. Also DVD von Technics, Verstärker von Sonie, Boxen von Magnat usw.

Wo ich noch drüber stolpere ist 2 x hersteller mit unterscheidlichen eigenschaften/beziehungen in einer sql-Abfrage.

Also eine Ausgabe der Hersteller für dvd und einmal den hersteller für verstärker

Hier habe ich einige Anregungen bekommen.

Hi!

ich denke dass was du suchst ist ein JOIN.

Infos darüber findest du unter: http://dev.mysql.com/doc/refman/5.1/de/join.html

wenn du dazu spezielle Fragen hast kannst du dich ja nochmal melden - les es dir aber bitte vorher durch :wink:

bis bald

Daniel

Danke für die schnelle Antwort.

Hier habe ich sehr schnell einige Anregungen bekommen.

join hatte ich bisher schon öfter angeschaut. Allerdings nie wirklich verstanden. In zahlreichen Seiten wird wortgleich beschrieben, was join macht aber nicht wie.

Was der Unterschied sein soll zwischen :
select * from steroanlagen where id=1 and verstaerker.id=stereoanlagen.verstaerker_id and verstaerker.hersteller_id=firmen.id
und der Umsetzung mit einem join, war mir bisher schleierhaft. Daher hier auch die Verständnis-Probleme mit zwei Tabellen. Bisher kannte ich das „as“ auch schon, aber nur um zB sum(preise) as gesamtumsatz zu nutzen, aber an ein alias eine Bedingung zu knüpfen hatte ich nie gemacht. Bisher habe ich wirklich immer mehrere Abfragen gemacht.

Eine der genannten zahlreichen Kombinationen wird mir hoffentlich auf die Sprünge helfen. Danke!