Moses: MySql Query - Zufällig aber doch nicht ganz

Hallo,
habe mal ne Frage zur MySql Abfrage.
Habe eine MySql Datenbank die ich über PHP abfrage.
In einer Tabelle habe ich Datensätze gespeichert, in einer anderen Kategorien für diese Datensätze.
Möchte nun daß mir zufällig Datensätze ausgeben werden, aber eben von jeder Kategorie einer - also nicht nur random, sondern random aber gleichzeit überprüfe Kategorie und gebe von jeder Kategorie einen Datensatz aus.

Danke für Hilfe und Tips.

Grüße,
Moses

  1. Hi Moses,

    Möchte nun daß mir zufällig Datensätze ausgeben werden, aber eben von jeder Kategorie einer - also nicht nur random, sondern random aber gleichzeit überprüfe Kategorie und gebe von jeder Kategorie einen Datensatz aus.

    Wie ist das numerische Verhältnis zwischen der Anzahl Deiner Kategorien und der Anzahl der Einträge pro Kategorie? Davon hängt eine effiziente Implementierung Deines Problems ab.

    Viele Grüße
          Michael

    --
    T'Pol: I apologize if I acted inappropriately.
    V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
    1. Hallo Michael!!

      Wie ist das numerische Verhältnis zwischen der Anzahl Deiner Kategorien und der Anzahl der Einträge pro Kategorie? Davon hängt eine effiziente Implementierung Deines Problems ab.

      Wieso?
      Ich würde für jede Kategierie ermitteln wieviele Datensätze, und dann mit einer Funktion wie phps rand() eine Zahl zwischen 1 und "Zahl der Datensätze in Kategorie $y" ermitteln, und diese dann für ein SELECT * FROM table WHERE kategorie = $x LIMIT $y,1 verwenden, das dann für alle Kategorien.
      Was einfacheres fällt mir nicht ein, und ist auch unabhängig von dem Verhältnis, oder?

      Viele Grüße
      Andreas

      1. Hi Andreas,

        Wie ist das numerische Verhältnis zwischen der Anzahl Deiner Kategorien und der Anzahl der Einträge pro Kategorie? Davon hängt eine effiziente Implementierung Deines Problems ab.
        Wieso?
        Ich würde für jede Kategierie ermitteln wieviele Datensätze, und dann mit einer Funktion wie phps rand() eine Zahl zwischen 1 und "Zahl der Datensätze in Kategorie $y" ermitteln, und diese dann für ein SELECT * FROM table WHERE kategorie = $x LIMIT $y,1 verwenden, das dann für alle Kategorien.
        Was einfacheres fällt mir nicht ein, und ist auch unabhängig von dem Verhältnis, oder?

        und wie lange dauert das bei einer Million Kategorien und einem SQL-Statement pro Kategorie?

        Wenn Du sehr viele Kategorien mit nur wenigen jeweils möglichen Werten hast, dann ist es erheblich performanter, die komplette Tabelle (ggf. sortiert) auszulesen und dann pro Kategorie lokal in der 3GL zu würfeln.

        Hast Du hingegen wenige Kategorien mit vielen Werten, dann ist Deine Methode gut.

        Viele Grüße
              Michael

        --
        T'Pol: I apologize if I acted inappropriately.
        V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
        1. Hallo Michael, Hallo Andreas,
          irgendwie habe ich euch beide verloren?? Diese Diskussion ist mir zu hoch.
          Also ich habe ungefähr zehn Kategorien (zur Zeit sind es nur fünf wird aber wohl erweitert werden) und zur Zeit ca 1.000 Datensätze denen jeweils eine oder zwei dieser Kategorien zugeordnet ist.

          Danke und Grüße,
          Moses

          1. Oops sorry,
            da bin ich wohl zwischendurch auf die Entertaste gekommen ohne es zu merken...
            Moses

          2. Hi Moses,

            Also ich habe ungefähr zehn Kategorien (zur Zeit sind es nur fünf wird aber wohl erweitert werden) und zur Zeit ca 1.000 Datensätze denen jeweils eine oder zwei dieser Kategorien zugeordnet ist.

            je weniger Kategorien Du hast, desto besser ist die Methode von Andreas (weil er ein SQL-Statement pro Kategorie abfeuern will).

            Hättest Du sehr viele Kategorien, dann wäre es besser, alles mit einem einzigen großen SQL-Statement zu lesen.

            Viele Grüße
                  Michael

            --
            T'Pol: I apologize if I acted inappropriately.
            V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
            1. Hi Michael!

              Hättest Du sehr viele Kategorien, dann wäre es besser, alles mit einem einzigen großen SQL-Statement zu lesen.

              Mich würde mal interessieren wie Du das dann machen würdest! Vermutlich ein Group By, aber woher kommt der Zufall? Order By rands()?

              Grüße
              Andreas

              1. Hi Andreas,

                Hättest Du sehr viele Kategorien, dann wäre es besser, alles mit einem einzigen großen SQL-Statement zu lesen.
                Mich würde mal interessieren wie Du das dann machen würdest! Vermutlich ein Group By, aber woher kommt der Zufall? Order By rands()?

                das kommt darauf an, wie viele Einträge pro Kategorie das sind. Wenn es beispielsweise nur jeweils zwei sind, dann mache ich einen full table scan und würfele erst in der 3GL.

                Viele Grüße
                      Michael

                --
                T'Pol: I apologize if I acted inappropriately.
                V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.
        2. Hallo Andreas, Hallo Michael,
          irgendwie habe ich da bei Eurer Diskussion den Faden verloren.....
          Ist alles noch etwas hoch für mich.
          Also ich habe ca. 10 Kategorie (zur Zeit sind es nur 5 aber wird erweitert werden) und zur Zeit ca. 1.000 Datensätze, denen jeweils eine oder zwei dieser Kategorien zugeordnet sind.
          Wenn ich das richtig verstehe, sollte ich also für jede dieser Kategorien rausfinden wieviele Datensätze vorhanden sind (erste MySql Abfrage) und dann via Php rand() eine Zahl zwischen eins und Gesamtanzahl der Datensätze generien lassen um diese dann in der zweiten Mysql Abfrage verwenden.
          Sprich für jede Kategorie zwei Abfragen?
          Wobei ich ehrlich gesagt, auch das mit dem Limit $y,1 nicht ganz verstehe - das würde doch heißen, daß diese Abfrage alle Datensätze von 1 bis $y abfrägt und trotzdem den ersten ausgibt - oder stehe ich da vollkommen auf dem Schlauch (was sehr wahrscheinlich ist - man sollte abends nach dem Feierabend Bierchen einfach nicht mehr posten...)
          Also beste Grüße vom für Aufklärung (nein, da weiß ich wie das geht) dankbaren Moses

          1. Hallo!

            Also ich habe ca. 10 Kategorie (zur Zeit sind es nur 5 aber wird erweitert werden) und zur Zeit ca. 1.000 Datensätze, denen jeweils eine oder zwei dieser Kategorien zugeordnet sind.

            Ich würde sagen das ließe sich mit meiner Methode lösen.

            Wenn ich das richtig verstehe, sollte ich also für jede dieser Kategorien rausfinden wieviele Datensätze vorhanden sind (erste MySql Abfrage) und dann via Php rand() eine Zahl zwischen eins und Gesamtanzahl der Datensätze generien lassen um diese dann in der zweiten Mysql Abfrage verwenden.

            Genau.

            Sprich für jede Kategorie zwei Abfragen?

            nicht unbedingt. Zum abfragen der Gesamtsummen pro Kategorie reicht IMHO auch ein SELECT count(*) as Anzahl FROM table GROUP BY kategorie

            Das sollte die Anzahl in den Kategoriern mit einer Abfrage bringen.

            Oder vielleicht auch die sparen, mit http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#IDX1232

            Wobei ich ehrlich gesagt, auch das mit dem Limit $y,1 nicht ganz verstehe - das würde doch heißen, daß diese Abfrage alle Datensätze von 1 bis $y abfrägt und trotzdem den ersten ausgibt - oder stehe ich da vollkommen auf dem Schlauch (was sehr wahrscheinlich ist - man sollte abends nach dem Feierabend Bierchen einfach nicht mehr posten...)

            Also wie LIMIT funktioniert steht hier:
            http://de.mysql.com/documentation/mysql/bychapter/manual.de_Reference.html#SELECT
            $y ist das Ergebnis von rand().

            Wie gesagt gibt es Rand auch in MySQL, nur bin ich nicht so sicher ob man das hier machen solte, vielleicht kann das Michael ja sagen.

            Grüße
            Andreas