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

  • 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

  • #2
    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.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      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())+

      Kommentar


      • #4
        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."
        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

        Kommentar


        • #5
          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..

          Kommentar


          • #6
            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.
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


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

              Kommentar


              • #8
                Zitat von santana2000 Beitrag anzeigen
                Es handelt sich um MySQL.
                Das ist heilbar
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  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.
                  Delirius

                  PHP - Grundlagen / PDO - Tutorial / PDO - Dokumentation

                  Kommentar


                  • #10
                    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..

                    Kommentar

                    Lädt...
                    X