WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   [mysql] einen Wert pro JOIN zurückgeben (http://www.wcm.at/forum/showthread.php?t=151647)

T.dot 28.11.2004 20:56

[mysql] einen Wert pro JOIN zurückgeben
 
Betreff is schlecht, aber mir fallt kein gscheiter ein.

Das ganze soll mit mysql funzen - ich hab (extrem vereinfacht ;) ) folgendes:

Ein Tabelle Zutaten, eine Tabelle Bilder
Es gibt mehrere Bilder für eine Zutat.

Ich möchte jetzt für zb Zutat 1,2,3 (ist natürlich ein dynamischer Wert der 1-10 Werte groß is) jeweils _ein_ zufälliges Bild aus der Bildertabelle nehmen und ausgeben.

Also einmal: Tequila -> Olmeca-Bild, nächstes mal Sierra-Bild, etc.

Grundsätzlich schaut die Abfrage für alle Bilder so aus:
SELECT BildURL From tblBilder INNER JOIN tblZutaten ON tblBilder.Zutat_ID=tblZutaten.Zutat_ID
WHERE tblZutaten.Zutat_ID IN (1,2,3)

Mögliche Lösung ist, für jede Zutat eine Unterabfrage machen, dabei kommen dann 20 Unterabfragen in der wirklichen query raus (geht nicht nur für Zutaten, sondern auch für Deko, Gläser, Zubereitung, ...).
Zweite Lösung wäre immer nur ein Bild pro Zutat einzutragen -> langweilig.


In Wirklichkeit soll die Funktion folgendes machen: Für einen Cocktail vier zufällige Bilder auslesen, die sich aus Zutaten, Dekoration, Gläsern und Zubereitung des Cocktails ergeben. Aber wenn ich mal wüsst wie ich das Problem oben lös, krieg ich das hin ;)

hoffe irgendwer versteht mich und weiß mir zu helfen
mfg Thomas

jak 28.11.2004 21:09

Ich schätz mal du gibst es nachher mit php aus. Also wird's wohl das einfachste sein, alle Werte für BildUrl in ein Array einzulesen und zufällig eins auszuwählen.

Jak

T.dot 28.11.2004 21:24

Ja könnt ich natürlich machen, es wäre nur einfacher, wenns über sql ginge. ;)

Wenns nur um ein paar Werte ginge würd ichs eh machen, aber nachdem ich da ca 20-30 Bilder zrückkrieg von denen je ca. 2-3 "gleich" sind is das relativ zach, weil eben die wirkliche Tabelle noch weitere zu vergleichende Felder beinhaltet :(

mfg Thomas

ps:
hab mal eine erste version online-gestellt, siehe hier
http://tdt.td.ohost.de/php/singleview.php?C_ID=91

wenn man paar mal neu-laden drückt sollt sich was ändern ;)

snowman 29.11.2004 13:45

Am Schluß deiner Abfrage:
Code:

ORDER BY RAND() LIMIT 1
sollte funzen.

gruss,
snowman

T.dot 29.11.2004 14:06

ja, so ähnlich mach ich das momentan auch. das funktioniert aber nur, wenn ich nur für eine Zutat ein zufälliges Bild haben will.

Wenn ich aber für mehrere Zutaten, bei denen mehrere Bilder rauskommen
(3 Zutaten mit je 3 Bildern, macht 9 Bilder) jeweils ein Bild/Zutat haben will geht das nicht ;)

also (sagen wir mal vereinfacht):
tblZutaten: 100 Zutaten
tblBilder: 300 Bilder, 3 pro Zutat

ich hab: Zutat_ID 1,2 und 3
und will für jede Zutat _jeweils ein_ Bild.
Also quasi insgesamt 3 Bilder für diese Abfrage.

Mögliche Lösung schaut so aus:
Code:

SELECT BildURL From tblBilder
WHERE tblBilder.Bild_ID IN (
(SELECT Bild_ID from tblBilder WHERE Zutat_ID=1 ORDER BY Rand() LIMIT 0,1),
(SELECT Bild_ID from tblBilder WHERE Zutat_ID=2 ORDER BY Rand() LIMIT 0,1),
(SELECT Bild_ID from tblBilder WHERE Zutat_ID=3 ORDER BY Rand() LIMIT 0,1)
)

-> nur ergibt das ganze dann bis zu 20-30 Select Abfragen ;) ;)

mfg Thomas

snowman 29.11.2004 14:52

Das würde ich in PHP über eine Schleife für Zutat_ID machen.

gruss,
snowman

T.dot 29.11.2004 15:10

Meinst du das schreiben des Sql-Strings oder einfach alles aulesen und danach doppeltes rausschmeißen?

Hm, am besten wärs wohl beides zu testen und das schnellere zu nehmen - Ich mach halt nur gern möglichst viel Datenbankseitig, wenns um sowas geht ;)

In Wirklichkeit würde das ganze mit verschachtelten Selects so aussehen:

Code:

SELECT BildURL From tblBilder
WHERE tblBilder.Bild_ID IN (
  (SELECT Bild_ID from tblBilder WHERE ID_Name='Z_ID' AND ID_Wert=1 ORDER BY Rand() LIMIT 0,1),
  (SELECT Bild_ID from tblBilder WHERE ID_Name='Z_ID' AND ID_Wert=2 ORDER BY Rand() LIMIT 0,1),
  (SELECT Bild_ID from tblBilder WHERE ID_Name='Z_ID' AND ID_Wert=3 ORDER BY Rand() LIMIT 0,1)
  (SELECT Bild_ID from tblBilder WHERE ID_Name='Z_ID' AND ID_Wert=4 ORDER BY Rand() LIMIT 0,1)
  (SELECT Bild_ID from tblBilder WHERE ID_Name='Z_ID' AND ID_Wert=5 ORDER BY Rand() LIMIT 0,1)
)
OR tblBilder.Bild_ID IN (
  (SELECT Bild_ID from tblBilder WHERE ID_Name='D_ID' AND ID_Wert=1 ORDER BY Rand() LIMIT 0,1)
  (SELECT Bild_ID from tblBilder WHERE ID_Name='D_ID' AND ID_Wert=2 ORDER BY Rand() LIMIT 0,1)
)
OR tblBilder.Bild_ID IN (
  (SELECT Bild_ID from tblBilder WHERE ID_Name='G_ID' AND ID_Wert=22 ORDER BY Rand() LIMIT 0,1)
)

ich glaube da is sowohl die eine, als auch die andere lösung zach...

mfg Thomas :)

T.dot 29.11.2004 20:00

Jo mai, ich hab jetz einfach ne Suchschleife drübergelegt, die doppelte IDs sucht und raushaut. Beim Datenbankauslesen tu ichs gleich zufällig sortieren, damit fällt mir das fürs array auch weg.

herzlichen Dank für eure Anregungen ;)

mfg Thomas


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:25 Uhr.

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