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


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:26 Uhr.

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