ORDER BY RAND() - MySQL select mit limit + where

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • ORDER BY RAND() - MySQL select mit limit + where

    Hi zusammen,

    Ich habe folgende query:

    Quellcode

    1. dbconn();
    2. mysql_query('SELECT @count := COUNT(*) FROM products');
    3. mysql_query('SET @offset = CONVERT(FLOOR(RAND() * @count), SIGNED)');
    4. mysql_query('PREPARE mystatement FROM "SELECT * FROM products LIMIT ?, 5"');
    5. $res = mysql_query('EXECUTE mystatement USING @offset');
    6. while($row = mysql_fetch_object($res))
    7. {
    8. echo $row->Category1."<br>";
    9. }


    Das funktioniert auch wunderbar, er gibt mir 5 zufällige Datensätze aus, aber ich brauche noch eine WHERE Clausel in der Abfrage, weil er mir 5 zufällige Datensätze auslesen soll in welcher die Category1 = Frauen ist. und das kriege ich irgendwie nicht gebacken :(

    Weiß jemand Rat?

    Danke vorab,
    Matze
    Das Leben ist binär - du bist eine 1, oder eine 0
  • Du hast recht. Rand() ist wirklich stark inperformant. Die Lösung mit den mysql variablen und dem OFFSET ist besser aber auch nur ein Mittel zum Zweck.
    Es werden der Reihe nach erst alle Datensätze gelesen und dann weggeworfen. Schau dir dazu mal die Diskussion im MySQL Performance Blog an: mysqlperformanceblog.com/2006/…performance-optimization/

    Prepared statements wären dazu jedenfalls nicht nötig, letztendlich brauchst du offset nicht als variable und du kannst da ganze auf zwei mysql querys begrenzen.

    Schau dir die Lösung von Apachez mal im Blog an. Ansonsten würde ich auch deinen Ansatz mal versuchen. Jedoch mit der Prämisse, dass du mit einem Subselect nur den Primary Key ausliest und erst in der äußeren Abfrage die Daten holst. Da der Index im Arbeitsspeicher liegt könnte das am performantesten sein. Aber Feldversuche habe ich damit nicht gemacht.

    Lg