schwierige Zufallsabfrage

effemmess

Grünschnabel
also nochmal...hab eben ausversehen mich selbst und damit wohl auch den Original-Thread gelöscht... :-( :eek:

Es existieren 2 Tabellen mit Bsp-daten:
PHP:
#
# Tabellenstruktur für Tabelle `ordner`
#

CREATE TABLE `ordner` (
  `cat_id` mediumint(8) NOT NULL auto_increment,
  `cat_name` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`cat_id`)
) TYPE=MyISAM AUTO_INCREMENT=4 ;

#
# Daten für Tabelle `ordner`
#

INSERT INTO `ordner` VALUES (1, 'ich');
INSERT INTO `ordner` VALUES (2, 'er');
INSERT INTO `ordner` VALUES (3, 'sie');

# --------------------------------------------------------

#
# Tabellenstruktur für Tabelle `pics`
#

CREATE TABLE `pics` (
  `pic_id` mediumint(8) NOT NULL auto_increment,
  `pic_name` varchar(255) NOT NULL default '',
  `cat_id` mediumint(8) NOT NULL default '0',
  PRIMARY KEY  (`pic_id`)
) TYPE=MyISAM AUTO_INCREMENT=11 ;

#
# Daten für Tabelle `pics`
#

INSERT INTO `pics` VALUES (1, 'fg', 1);
INSERT INTO `pics` VALUES (2, 'thjrzj', 1);
INSERT INTO `pics` VALUES (3, 'thrwzh', 2);
INSERT INTO `pics` VALUES (4, 'rzjhzr', 3);
INSERT INTO `pics` VALUES (5, 'wth', 2);
INSERT INTO `pics` VALUES (6, 'jhzrjrzj', 3);
INSERT INTO `pics` VALUES (7, 'ukrz', 1);
INSERT INTO `pics` VALUES (8, 'nnnn', 2);
INSERT INTO `pics` VALUES (9, 'www', 2);
INSERT INTO `pics` VALUES (10, 'zjzrjrzjzr', 3);
So, nun brauche ich aus jedem Ordner ein Zufallsbild. Wie macht man das?
Der bisher eingegangene Vorschlag
PHP:
SELECT pics.pic_name, ordner.cat_name
FROM pics
LEFT JOIN ordner ON pics.cat_id = ordner.cat_id
ORDER BY rand( )
LIMIT 1
funktioniert nicht, da er ja nur insgesamt ein Zufallsbild liefert...:(

Kann mir jemand weiterhelfen? Ich hätte das gern in einer SQL-Abfrage gelöst...
 
Zuletzt bearbeitet:
Ich hatte mich doch nicht gelöscht, es war der DB-Crash hier auf tutorials.de...
Nicht so tragisch..., außer wenn da grade jemand ne passende Antwort geliefert hatte.
 
jo das limit 1 sorgt dafür das du nur ein Ergebnis bekommst

Weglassen und du bekommst alle zufällig durcheinandergewürfelt
 
nun ja, dies bedeutet aber, daß auch 2 pics aus dem selben Ordner im Ergebnis stehen können. Und das ist ja nicht gewollt. Beim Beispiel sind es 3 Ordner, demzufolge sollen genau 3 pics ausgewählt werden mit der Bedingung, daß sich alle in einem unterschiedlichen Ordner befinden...
Klar, man könnte vielleicht erst diesen JOIN mit RAND ohne LIMIT machen um dann in einem zweiten Schritt aus dieser temporären Tabelle (evtl. mit php) den jeweils ersten Eintrag eines jeweiligen Ordners in die endgültige Ergebnistabelle einlesen. Aber gerade diese beiden Schritte (1.temp. Zufallstabelle erstellen;2. mittels Schleife aussuchen) sind bei großen Tabellen suuuuper resourcenfressend (HD-Speicher,RAM) und im Endeffekt enorm zeitraubend.
Die zweite Möglichkeit sehe ich mit x (x=Anzahl der Ordner) "SELECT ... RAND() LIMIT 1". Aber auch das wird bei z.B. 4956 Ordnern sehr zeitintensiv.

Hat jemand ne Idee? Ich hab mich jetzt bestimmt schon effektiv so 12 Stunden mit diesem Problem herumgeplagt... :(
 
SELECT pics.pic_name,distinct ordner.cat_name
FROM pics
LEFT JOIN ordner ON pics.cat_id = ordner.cat_id
ORDER BY rand( )
LIMIT 3

sollte 3 bilder aus 3 verschiedenen Ordnern liefern :)
 
geht nicht :( :

SELECT pics.pic_name, DISTINCT ordner.cat_name
FROM pics
LEFT JOIN ordner ON pics.cat_id = ordner.cat_id
ORDER BY rand( )
LIMIT 3

MySQL meldet:

#1064 - You have an error in your SQL syntax near 'DISTINCT ordner.cat_name
FROM pics
LEFT JOIN ordner ON pics.cat_id = ordner.cat' at line 1

Soweit ich es verstanden habe, gehören SELECT und DISTINCT zusammen und liefern dann alle nicht identischen Datensätze aus dem Gesamtselect. Oder ist meine Interpretation falsch?
 
Zurück