WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 28.11.2004, 20:56   #1
T.dot
Master
 
Registriert seit: 13.08.2003
Beiträge: 624


Standard [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
T.dot ist offline   Mit Zitat antworten
Alt 28.11.2004, 21:09   #2
jak
Inventar
 
Registriert seit: 13.06.2001
Beiträge: 1.830


Standard

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
____________________________________
Join the DNRC | Godwin\'s Law (thx@stona)
Documentation is like sex: If it\'s good, it\'s very, very good. If it\'s bad, it\'s better than nothing.
\"In theory, theory and practice are the same. In practice, they are not\" (Lawrence Berra)
jak ist offline   Mit Zitat antworten
Alt 28.11.2004, 21:24   #3
T.dot
Master
 
Registriert seit: 13.08.2003
Beiträge: 624


Standard

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
T.dot ist offline   Mit Zitat antworten
Alt 29.11.2004, 13:45   #4
snowman
Inventar
 
Registriert seit: 26.09.1999
Beiträge: 2.569


Standard

Am Schluß deiner Abfrage:
Code:
ORDER BY RAND() LIMIT 1
sollte funzen.

gruss,
snowman
____________________________________
MediaMarkt? Ich bin doch nicht blöd, Mann!

Vorsprung durch Technik

Lesen Sie keine Anleitungen, FAQs, Readme - Files. Reine Zeitverschwendung. In den Newsgroups und Foren gibt es genug kompetente Leute, die mit großer Geduld immer wieder dieselben einfachen Fragen beantworten. Völlig kostenlos noch dazu!
snowman ist offline   Mit Zitat antworten
Alt 29.11.2004, 14:06   #5
T.dot
Master
 
Registriert seit: 13.08.2003
Beiträge: 624


Standard

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
T.dot ist offline   Mit Zitat antworten
Alt 29.11.2004, 14:52   #6
snowman
Inventar
 
Registriert seit: 26.09.1999
Beiträge: 2.569


Standard

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

gruss,
snowman
____________________________________
MediaMarkt? Ich bin doch nicht blöd, Mann!

Vorsprung durch Technik

Lesen Sie keine Anleitungen, FAQs, Readme - Files. Reine Zeitverschwendung. In den Newsgroups und Foren gibt es genug kompetente Leute, die mit großer Geduld immer wieder dieselben einfachen Fragen beantworten. Völlig kostenlos noch dazu!
snowman ist offline   Mit Zitat antworten
Alt 29.11.2004, 15:10   #7
T.dot
Master
 
Registriert seit: 13.08.2003
Beiträge: 624


Standard

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 ist offline   Mit Zitat antworten
Alt 29.11.2004, 20:00   #8
T.dot
Master
 
Registriert seit: 13.08.2003
Beiträge: 624


Standard

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
T.dot ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:01 Uhr.


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