Ankündigung

Einklappen
Keine Ankündigung bisher.

SELECT mit Random im WHERE

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • santana2000
    hat ein Thema erstellt SELECT mit Random im WHERE.

    SELECT mit Random im WHERE

    Hallo Jungs

    Ich machs kurz. Die User können bis zu max 6 Bilder hochladen. Das jeweilige Pfad wird in der DB abgelegt. In der Spalte images.imagenr wird die Bildnummer 1-6 abgespeichert. Die User sind in Kategorien unterteilt.

    Nun möchte ich nebst sämtlichen Informationen, pro Kategorie den zuletzt registrierten User selektieren und jeweils ein zum User zugehörigen Bild mitselektieren. Dabei soll die Wahl des Bildes zwischen den 6 Bilder pro User in random selektiert werden.

    Wobei nicht alle User alle 6 Bilder hochladen, sondern evtl. nur Bild 2 und 3. Hier darf das RANDOM nicht auf 1,4,5 und 6 greifen.

    Hier mein aktueller Versuch:
    PHP-Code:
    $select $mysqli->query("
        SELECT profil.id_user, category.category, images.small AS img, profiltext.titel, einfuehrung
        FROM profil
        LEFT JOIN userstatus ON profil.id_user = userstatus.id_user
        LEFT JOIN profiltext ON profil.id_user = profiltext.id_user
        LEFT JOIN category ON userstatus.id_category = category.id
        LEFT JOIN images ON profil.id_user = images.id_user
        RIGHT JOIN kundendienstleistungen ON category.id = kundendienstleistungen.id_category
        WHERE userstatus.profil_ready = '1' AND category NOT IN ('freeUser') AND einfuehrung IS NOT NULL AND images.imagenr = "
    ./*hier sollte die RANDOM Funktion integriert werden.*/."
        GROUP BY category.id
        ORDER BY userstatus.aktiviertam
    "
    );
    while(
    $row $select->fetch_assoc()) {
        echo 
    "<img src=\"".$row['img']."\" height=\"184px\" width=\"328px\">";

    Wie kann ich nun hier ein Random integrieren, dass für den Jeweiligen User images.imagenr nach Zufall selektiert?

    Danke für eure Hilfe.

    Gruss

  • santana2000
    antwortet
    Danke jungs..

    Ich habe nach Alternativen zu DISTINCT ON für mysql gesucht und hab da was gefunden. (Zeile 2)

    Meine aktuelle (funktionierende) Lösung:
    Code:
        SELECT r.id_user, 
              (SELECT r1.small FROM images AS r1 WHERE r.id_user = r1.id_user ORDER BY RAND() LIMIT 1) AS 'img', 
               category.category,
               profiltext.titel, 
               einfuehrung
        FROM images AS r
        LEFT JOIN profil ON r.id_user = profil.id_user
        LEFT JOIN userstatus ON profil.id_user = userstatus.id_user
        LEFT JOIN profiltext ON profil.id_user = profiltext.id_user
        LEFT JOIN category ON userstatus.id_category = category.id
        RIGHT JOIN kundendienstleistungen ON category.id = kundendienstleistungen.id_category
        WHERE userstatus.profil_ready = '1' AND category NOT IN ('freeUser') AND einfuehrung IS NOT NULL
        GROUP BY category.id
        ORDER BY r.id_user, userstatus.aktiviertam
    hier kommt es nun nicht mehr auf die Nummerierung 1-6 an, sondern auf das vorhandene Bildpfad (r1.small) als Random. Damit bin ich sehr zufrieden..

    Einen Kommentar schreiben:


  • Delirius
    antwortet
    SELECT mit Random im WHERE

    Zitat von santana2000
    Nun möchte ich nebst sämtlichen Informationen, pro Kategorie den zuletzt registrierten User selektieren und jeweils ein zum User zugehörigen Bild mitselektieren.
    Du könntest dir ein Sub-SELECT in deine WHERE-Bedingung einbauen und dann sowas einsetzen:
    Code:
    (...)
    AND
          images.imagenr = (
                SELECT
                      (...)
                ORDER BY
                      RAND()
                LIMIT 1
          )
    Im Sub-SELECT muss dann eben die Zuweisung der vorhandenen Bilder zum User vorhanden sein. Aber das hast du wohl ( aus deinen Zeilen zu lesen ) gemacht.

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    Zitat von santana2000 Beitrag anzeigen
    Es handelt sich um MySQL.
    Das ist heilbar

    Einen Kommentar schreiben:


  • santana2000
    antwortet
    Falls Du mit MySQL unterwegs bist: DISTINCT ON(...) kann MySQL nicht
    Hätte ich vielleicht noch erwähnen sollen. Es handelt sich um MySQL.

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    Zitat von santana2000 Beitrag anzeigen
    Es sieht in etwa so aus wie akretschmer es simuliert hat. (übrigens, danke.) Das kommt der Sache sehr nahe.
    Bitte, kein Problem.

    Ich verstehe nur noch nicht, ob ich das beim obersten SELECT integrieren soll, oder ob es ein SELECT im WHERE sein soll..
    Ich hab mich jetzt nicht tiefer in Deine Tabellen eingelesen, aber Du hast ja offenbar eine Tabelle mit den Usern und bis zu 6 Zeilen dann je User mit den Bildern. Mit dem Select bekommst eine Tabelle mit 1 Zeile je User und einem zufälligem Bild, diese kannst Du dann nach belieben irgendwo JOINen.

    Falls Du mit MySQL unterwegs bist: DISTINCT ON(...) kann MySQL nicht.

    Einen Kommentar schreiben:


  • santana2000
    antwortet
    Allerdings lässt mich dies schon erahnen das du die Bilder wirklich in spalten a la bild_1, bild_2 ... mein vorschlag wäre, lagere die speicherung der bilder in eine eigene Tabelle aus.
    Hast du meine Frage richtig verstanden? Wenn du alles genau durchliest, wirst du erkennen wo die Nummerierung gespeichert wird. Nix da a la bild_1 bils_2 ... !!

    Es sieht in etwa so aus wie akretschmer es simuliert hat. (übrigens, danke.) Das kommt der Sache sehr nahe. Ich verstehe nur noch nicht, ob ich das beim obersten SELECT integrieren soll, oder ob es ein SELECT im WHERE sein soll..

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    Zitat von der_robert Beitrag anzeigen
    Das ganze für SQL
    Schön daß Du Deinen Namen tanzen kannst, aber was ist mit "Wobei nicht alle User alle 6 Bilder hochladen, sondern evtl. nur Bild 2 und 3. Hier darf das RANDOM nicht auf 1,4,5 und 6 greifen."

    Einen Kommentar schreiben:


  • der_robert
    antwortet
    Das ganze für MySQL

    PHP-Code:
    ROUND(RAND())+
    5 ist die anzahl der Bilder die der user hochgeladen hat minus 1. Hat der user also 6 bilder hochgeladen ist das 6-1=5, hat er 4 Bilder hochgeladen ist das 4-1=3.

    +1 verhindert das 0 raus kommt

    Da ich mal davon ausgehe das du keine spalten hast a la bild_1, bild_2 etc, lässt du einfach die anzahl der hochgeladenen Bilder zählen, zihst eins ab und setzt dies dann an die Stelle wo oben die 5 steht.


    Wobei nicht alle User alle 6 Bilder hochladen, sondern evtl. nur Bild 2 und 3. Hier darf das RANDOM nicht auf 1,4,5 und 6 greifen.
    Allerdings lässt mich dies schon erahnen das du die Bilder wirklich in spalten a la bild_1, bild_2 ... mein vorschlag wäre, lagere die speicherung der bilder in eine eigene Tabelle aus.

    sort (um die möglichekeit zu haben die Reihenfolge der Bilder unabhänig von hochladen festlegen zu können, siehe User 3, das 5 Bild ist dann das erste welches angezeigt werden würde.)

    user_id ; img_id ; sort ; [...]
    1;1;1
    1;2;2
    1;3;3
    2;1;1
    2;2;2
    3;1;5
    3;2;2
    3;3;4
    3;4;3
    4;5;1


    Hat ein User nur ein Bild hochgeladen muss (anzahl der hochgeladenen bilder->) 1-1=0 berechnet werden, setzt du die 0 statt der 5 ein, kommt immer 1 raus.
    PHP-Code:
    ROUND(RAND())+

    Einen Kommentar schreiben:


  • akretschmer
    antwortet
    Zitat von santana2000 Beitrag anzeigen
    Wobei nicht alle User alle 6 Bilder hochladen, sondern evtl. nur Bild 2 und 3. Hier darf das RANDOM nicht auf 1,4,5 und 6 greifen.
    Code:
    test=*# select * from bilder ;
     user_id | bild
    ---------+------
           1 |    2
           1 |    4
           2 |    4
           2 |    5
           2 |    6
          23 |    6
           3 |    6
           3 |    1
           3 |    2
           3 |    3
           3 |    5
    (11 rows)
    
    Time: 0,162 ms
    test=*# select distinct on (user_id) user_id, bild from bilder order by user_id, random() ;
     user_id | bild
    ---------+------
           1 |    2
           2 |    6
           3 |    3
          23 |    6
    (4 rows)
    Das an Deine Bedürfnisse anzupassen überlasse ich Dir zur Übung.

    Einen Kommentar schreiben:

Lädt...
X