# MySQL - Pro Kategorie ein Eintrag



## hamst0r (21. Juli 2012)

Hallo,
ich habe eine MySQL Tabelle, die folgendermaßen aufgebaut ist:

```
img                  thumbnail                       thema                    headline
--------------------------------------------------------------------------------------
pfad/img1.jpg        pfad/th/img1.jpg                thema1                   Thema 1
pfad/img2.jpg        pfad/th/img2.jpg                thema1                   Thema 1
pfad/img3.jpg        pfad/th/img3.jpg                thema2                   Thema 2
pfad/img4.jpg        pfad/th/img4.jpg                thema2                   Thema 2
```

Nun möchte ich mit pro "thema" ein zufälligen Datensatz bekommen.


----------



## JimSim (21. Juli 2012)

SELECT * FROM 'tabelle' Where 'thema' = 'thema1' Order by RAND() LIMIT 1;

Sollte funktionieren...

EDIT: Wenn du jetzt für mehrere ein zufälliges haben willst musste das für jedes thema (1, 2, ... etc.) einzeln machen, anders geht das bei MySQL glaub ich nicht.

Man könnte evtl was mit subqueries machen... aber das mir jetzt zu viel Aufwand.


----------



## DarkMo (21. Juli 2012)

noch nen kleiner verbesserungsvorschlag: wozu speicherst du die thumbnail position nochma einzeln? ich würd bei "img" einfach nur "img1" "img2" usw speichern und die thumb spalte weglassen. in der anwendung kennste den pfad zu deinem image und thumb ordner und kannst mit dem einen eintrag da alles andere herleiten.


----------



## hamst0r (21. Juli 2012)

JimSin: Danke, aber das würde nur von thema1 ein zufälligen Eintrag ausgeben oder? Ich möchte für jedes Thema ein Zufallseintrag haben.
Darkmo: Werde ich nochmal überdenken, würde natürlich Sinn machen.


----------



## JimSim (21. Juli 2012)

hamst0r schrieb:


> JimSin: Danke, aber das würde nur von thema1 ein zufälligen Eintrag ausgeben oder? Ich möchte für jedes Thema ein Zufallseintrag haben.
> Darkmo: Werde ich nochmal überdenken, würde natürlich Sinn machen.


 
Ist etwas aufwändiger, würde etwa so aussehen:
SELECT tabelle1.thema, (SELECT id FROM tabelle tabelle2 WHERE tabelle1.thema=tabelle2.thema ORDER BY RAND() LIMIT 1) AS 'id' FROM tabelle tabelle1 GROUP BY thema


----------



## hamst0r (22. Juli 2012)

Vielen Dank, jedoch benutze ich ein kleines selbstgeschriebenes Framework, womit so eine Abfrage leider nicht möglich ist.
Ich habe es jetzt hinbekommen und muss einfach mal hoffen, dass nicht zu viele verschiedene Themen entstehen, da bei jedem Thema eine Datenbankabfrage ausgeführt wird.
Ich habe es so gelöst, dass ich zuerst alle verschiedenen Themen mit "group by" auslese und dann bei jedem Thema ein Bild mit "order by rand() Limit 1" ausgelesen wird.
Vielen Dank für eure Hilfe.

Gruß hamst0r


----------



## Supeq (23. Juli 2012)

Um wirklich zufällig einen Datensatz zu bekommen, kannst du den Webservice von RANDOM.ORG - HTTP Interface Description implementieren und daraus abgeleitet deine Query an die Datenbank schicken ^^


----------



## DarkMo (23. Juli 2012)

hmm, könnte man nich vllt das random "db extern" gestalten? also jetzt mal plöde gesagt: rnd = random(); sql_query("select from where id = rnd"); - also jetz ganz ganz ganz grob pseudo code mäßig  id wird man schlecht nehmen können, weil die wird bei nem forum für die threads bestimmt ned ewig fortlaufend sein. also bsp themen-id's 1 2 4 6 7 gibts und rnd ergibt 3... ^^

aber vllt kannste dir ja die anzahl der themen per qry raussuchen lassen, dann von 1 bis anzahl ne zufallszahl ziehen und dann das thema an der position da raussuchen lassen. also bei der obigen liste und rnd = 3 sollte er dann das thema 4 ausgeben. hab mich scho länger ned mehr mit sql befasst, weis also grad ned, inwiefern das umsetzbar wäre >< aber eventuell isses ja ne idee wert ^^


----------



## hamst0r (23. Juli 2012)

DarkMo: Ich glaube du hast das falsch verstanden. Ich möchte nicht ein Zufallsthema bekommen, sondern für jedes Thema ein Zufallseintrag, ich habe ja jetzt eine Lösung, ich wollte nur wissen ob es mit weniger Datenbankabfragen geht. Solange die Themen nicht zu viele werden sollte es ja kein Problem sein mit meiner Lösung.

Supeq: Läuft ja jetzt, das wär mir jetzt zu umständlich.


----------



## DarkMo (23. Juli 2012)

asöööö ok ^^ na dann isses für de tonne ^^


----------



## JimSim (23. Juli 2012)

Naja, wie viele Themen es gibt, ist doch eigentlich wurst. Da schreibste einfach ne Schleife und lässt da alle möglichen Themen durch rattern... Und fängst dann die Ergebnisse halt in nem Array auf.


----------



## hamst0r (23. Juli 2012)

Es wird aber pro Thema noch eine Datenbankabfrage gestartet. Hätte ich also 100 Themen, wären es 100 Datenbankabfragen pro Seitenaufruf.
Oder verlangsamen Datenbankabfragen nicht stark die Ladezeit?


----------



## JimSim (23. Juli 2012)

Naja, theoretisch schon. Praktisch ist meiner Meinung nach eher die Größe des Ergebnisses relevant. Da du immer nur 1 ausgibst, sollte das nicht so wild sein. Das sind immer noch nur 100 rows bei 100 Abfragen... Langsam wird es bei 100 Themen dann, wenn du die 100 Themen inklusive Bilder auf einer Seite anzeigen lassen willst.


----------



## hamst0r (23. Juli 2012)

Es wird pro Thema ein Bild angezeigt.  Aber ich denke es werden niemals mehr als 10-15 Themen werden.
Danke für eure Hilfe, habe aber noch ein kleines anderes Problem und finde den Fehler nicht.


```
$entry = preg_replace('#\[url=(.*)\]\[img\](.*)\[/img\]\[/url\]#isU', "<div class=\"image\"><a href=\"$1\"><img src=\"$2\" alt=\"Bild\"></a></div>", $entry);
```

Und folgender Code wird nicht umgewandelt
http://pastie.org/4308702


----------



## JimSim (24. Juli 2012)

Sorry, aber Regular Expressions hasse ich wie die Pest. 
Kein Plan was genau da nicht geht. Evtl. gibt es Probleme mit escapen im Code?
Keine Ahnung... Am besten du machst das erstmal Stück für Stück. Also guckst nach ob der alleine das  erkennt etc. und dann weiter vor tasten... Es gibt auch Seiten die einem solche Regular Expressions erstellen, wobei die nicht immer gut funktionieren...


----------



## hamst0r (24. Juli 2012)

```
$entry = preg_replace('#\[url=(.*)\](.*)\[/url\]#isU', "<a href=\"$1\">$2</a>", $entry);
```
Funktioniert super und

```
$entry = preg_replace('#\[img\](.*)\[/img\]#isU', "<img src=\"$1\" alt=\"Bild\">", $entry);
```
auch. Daraus habe ich das erstellt. Funktioniert leider nicht, dann muss ich wohl weiter googlen. Danke trotzdem. 

Hab es raus, ist kein Fehler drin. Ich hatte einfach vor dem "Spezialfall" die URL-Umwandlung drin. Läuft jetzt alles.


----------

