WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   [mysql] umgehen von verschachtelten Selects (http://www.wcm.at/forum/showthread.php?t=137995)

T.dot 28.06.2004 09:25

[mysql] umgehen von verschachtelten Selects
 
Halli Hallo!

Wie ich gestern zu meinem Entsetzen feststellen musste, unterstützt MySQL keine verschachtelten Abfragen. Nachdem ich die aber bis jetzt in diversen Access Projekten verwendet habe und nicht wirklich weiß, wie ich diese nun umgehen soll, bräuchte ich eure Hilfe.

Ich geh in diesem Fall von zwei Tabellen aus, die eine ist eine Liste von Cocktails mit Namen, CocktailID, etc. und die zweite beherbergt die jeweiligen Zutaten für diese Cocktails. In dieser gibt es also eine CocktailID zur Verknüpfung und dann diverse ZutatenIDs. Nun möchte ich auslesen in welchen Cocktail zb die Zutat Rum und Orangensaft vorkommt. Das ganze würde ich so machen:

PHP-Code:

SELECT tblCocktails.C_IDtblCocktails.Cocktailname
FROM tblCocktails 
WHERE tblCocktails
.C_ID IN 
    
(SELECT tblCocktailZutaten.C_ID 
     FROM tblCocktailZutaten 
     WHERE tblCocktailZutaten
.Z_ID=60)
AND 
tblCocktails.C_ID IN 
    
(SELECT tblCocktailZutaten.C_ID 
     FROM tblCocktailZutaten 
     WHERE tblCocktailZutaten
.Z_ID=32

Funkt in Access, aber in MySQL natürlich nicht. Kann ich das ganze nun über irgendwelche Joins oder sonst irgendwie anders lösen ohne PHP basteln zu müssen (so habe ich es momemtan gelöst).

Herzlichsten Dank, Thomas

rollipolli 28.06.2004 09:59

naja, wenn du SQL in irgendeiner Wirtssprache (PHP, Java was auch immer) benutzt, könntest du die Subselects vorher als eigene Select ausführen, und deren Ergebnis dann im äußeren Select benutzen..

..oder wenn dir MySQL nicht fix vorgesetzt wird, benutze PostgreSQL.
http://www.postgresql.org/

T.dot 28.06.2004 10:13

@rollipolli
Ja ich verwende PHP als Wirtssprache und habe es derzeit auch so gelöst, das eben zuerst die zwei unterselects ausgeführt werden, ich die werte dann in strings zwischenspeicher und dann die große Abfrage ausführ... hätt halt gern alles in einem ;)

noch möcht ich nicht auf anderen SQL Dialekt umsteigen, aber falls ich mich im Lauf meines Projektes noch öfters ärger werd ichs mir mal ankucken ;)

FordPrefect 28.06.2004 10:29

Natürlich kannst Du das mit Joins lösen. MySQL unterstützt:
[CROSS] JOIN
INNER JOIN
STRAIGHT_JOIN
LEFT JOIN und
LEFT OUTER JOIN

Und wenn Du Dir PHPMyAdmin besorgst kannst Du auch mit Foreign Keys arbeiten.
Weiss jetzt leider die Webseite nicht.
mfg Peter

wbendl 28.06.2004 10:30

Hi!

Ich glaube das geht ganz leicht.

Wenn du mit Access eine Abfrage erstellst, wird das passende SQL-Statement mit JOIN erstellt.

Eventuell notwendige Anpassungen sind leicht händisch durchzuführen.

mfg

WB

FordPrefect 28.06.2004 10:32

So hier ist nun die Adresse
PHPMyAdmin
mfg
Peter

T.dot 28.06.2004 11:09

@wbendl
Da hast du schon recht, nur leider ist es in Access ziemlich unmöglich (zumindest hab ich es nicht geschafft) diese Abfrage ohne Eingriff in den SQL Code und innerhalb einer einzigen Abfrage zu erstellen. Sonst hätte ich das schon getan. Leider hab ich in Access bis jetzt auch immer nur Inner Joins, die ich einfach durch Where ersetzen kann gesehen. Falls es doch möglich ist, lass ich mich gerne eines bessern belehren.

@FellnerPeter
Ja, wird mir wohl nichts anderes überbleiben als mich in die Thematik von den diversen Join-Arten einzulesen ;)

mfg Thomas

FordPrefect 28.06.2004 11:13

Zitat:

Original geschrieben von T.dot

@FellnerPeter
Ja, wird mir wohl nichts anderes überbleiben als mich in die Thematik von den diversen Join-Arten einzulesen ;)

mfg Thomas

Oder Du verwendest PHPMyAdmin damit kannst Du auch Abfragen erstellen die dann auf MySQL zugeschnitten sind :)
mfg
Peter

T.dot 28.06.2004 11:46

hmhm...

hab jetzt nur kurz in PHPmyadmin reingeschnüffelt, aber wenn der Abfrageeditor so wie er in der Standardansicht erscheint alles ist, was abfragemässig drin ist hab ich auch keinen Plan wie ich das dort angehen soll, ohne mich mit joins auszukennen...

Inzwischen habe ich mit Hilfe eines ehemaligen Schulkollegens das Problem auf eine andere Weise gelöst:

PHP-Code:

SELECT tblCocktails.C_IDtblCocktails.Cocktailname
FROM tblCocktails 
INNER JOIN tblCocktailZutaten 
ON tblCocktails
.C_ID tblCocktailZutaten.C_ID
WHERE 
(((tblCocktailZutaten.Z_ID)=32 Or (tblCocktailZutaten.Z_ID)=60))
GROUP BY tblCocktails.C_IDtblCocktails.Cocktailname
HAVING 
(((Count(tblCocktails.C_ID))=2)); 

bin zwar nicht sonderlich glücklich damit, aber es funktioniert zumindest...

mfg Thomas

wbendl 28.06.2004 12:31

Hi!

Ich denke die Lösung liegt in der Verwendung von LEFT JOIN oder RIGHT JOIN.

Wenn du mir eine Beispiel-DB zur Verfügung stellst, mach ich ein paar Versuche.

Eine Access-DB müsste allerdings im Format von Access 97 sein.
Dazu noch eine möglichst genaue Beschreibung, wie das Ergebnis aussehen soll.

mfg

WB

frazzz 28.06.2004 12:47

was mich wundert ist:

tblCocktailZutaten.Z_ID)=32


du kennst alle zutaten-id's auswendig?
oder liest du die vorher aus?

T.dot 30.06.2004 00:20

Sorry, das ich mich so spät melde, war bis jetzt im Dienst bzw. unterwegs...

@frazz
Eigentlich stammen die IDs aus 5 Select Feldern zur Auswahl von Zutaten bei der Cocktailsuche, in welchen die Zutat angezeigt und die ID zurückgeliefert wird. Ich experimentier halt mit 32 und 60 (Orangensaft und weißer Rum) da ich da weiß, wieviel Cocktails rauskommen müssen...

Die gekürzte Form (nur die beiden relevanten Tabellen) der Datenbank gibts auf:
http://members.aon.at/stemmer/cocktailtest.zip (2000er Access)
bzw.
http://members.aon.at/stemmer/cocktailtest97.zip (97er Access)

Wie das Abfrageergebnis aussehen soll ersieht man am einfachsten, indem man den von mir anfangs verwendeten SQL Code in eine Abfrage schmeisst...

mfg Thomas

wbendl 30.06.2004 13:43

Hi!

Nachdem ich mir das Beispiel angesehen habe, ist mir zumindest die Problemstellung klar.

Die von deinem Freund gefundene Lösung scheint mir eigentlich recht gut zu sein.
Besonders wenn man alle 5 Möglichkeiten zur Auswahl verwendet, ist die Version mit den verschachtelten Abfragen ziemlich aufwendig.
Eine eventuelle Lösung mit JOIN wäre in diesem Fall ein Monstrum, das kein Mensch durchblickt.

Wenn die IDs aus Auswahlfeldern kommen, und du nur mehr die Anzahl der IDs feststellen mußt, ist es wahrscheinlich auch die schnellste Lösung.

Ich bin kein Fachmann für PHP, aber ich mache viel mit DBs.
Eine Verkettung oder Verschachtelung von Abfragen erzeugt mehr Last und Traffic.
Ich rate dir also die vorhandene Lösung beizubehalten.

mfg

WB


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag