Kurti: Frage zu MySql Abfrage

Hi,
arbeite mit MySql (niedrige 4er Version - glaub ich) und PHP 5

Habe eine Tabelle mit Bestellungen und möchte aus dieser Tabelle die Top Ten Produkte je Land auswählen. Ich kann die Top Ten Produkte insgesamt wählen, und ich kann für jedes Land eine eigene Abfrage schreiben und mir die jeweiligen Top Ten ausgeben lassen, aber nicht für alle Länder...

select produkt_id, sum(produkt_anzahl) as menge, land from bestellung GROUP BY land, produkt_id ORBER BY menge DESC

soweit so gut, aber wie mache ich das, daß je Land max. die Top 10 Einträge ausgelesen werden?
einfaches LIMIT 10 hilft da nicht ;-) (ja, ich bin so verzweifelt, daß ich sogar das ausprobiert habe und auf eine Überraschung gehofft habe...)

Wäre wirklich dankbar, wenn mir hier einer weiterhelfen könnte

Grüße,
der Kurti

  1. Hallo,

    arbeite mit MySql (niedrige 4er Version - glaub ich) und PHP 5

    welche genau - das ist wichtig. 4.0 kann UNION, 4.1 endlich Unterabfragen.

    Habe eine Tabelle mit Bestellungen und möchte aus dieser Tabelle die Top Ten Produkte je Land auswählen. Ich kann die Top Ten Produkte insgesamt wählen, und ich kann für jedes Land eine eigene Abfrage schreiben und mir die jeweiligen Top Ten ausgeben lassen, aber nicht für alle Länder...

    Typischerweise wäre es eine Aufgabe für eine Unterabfrage, bitte gib daher die genaue MySQL-Version an. Diese erhältst Du mit der Abfrage

    SELECT VERSION()

    Freundliche Grüße

    Vinzenz

    1. Typischerweise wäre es eine Aufgabe für eine Unterabfrage, bitte gib daher die genaue MySQL-Version an. Diese erhältst Du mit der Abfrage

      SELECT VERSION()

      Hallo Vinzenz,
      hier das Ergebnis
      4.0.27-max-log

      werde wohl eine gesamt Abfrage machen müssen und dann via PHP das Ergebnis entsprechend auslesen... schade, dachte das geht eleganter.

      Danke euch,
      der Kurti

      1. Hallo,

        Typischerweise wäre es eine Aufgabe für eine Unterabfrage, bitte gib daher die genaue MySQL-Version an. Diese erhältst Du mit der Abfrage

        SELECT VERSION()
        4.0.27-max-log

        diese Version ist vom 6. Mai 2006 und meiner Meinung nach jenseits von gut.

        werde wohl eine gesamt Abfrage machen müssen und dann via PHP das Ergebnis entsprechend auslesen... schade, dachte das geht eleganter.

        am 14. November 2008 wurde mit MySQL 5.1.30 die Version 5.1 zur aktuellen Version. Version 5.0.15 war am 19. Oktober 2005 die erste Produktionsversion der 5.0-Reihe, selbst der erweiterte Support für MySQL 4.0 ist inzwischen ausgelaufen. Wie wäre es mit einer Aktualisierung?

        Der Umstieg von 4.0 auf eine 5.0 oder 5.1 will gut getestet sein, weil es nicht nur jede Menge neue (und wichtige) Features gibt, sondern auch völlig kaputtes Verhalten (auf das sich viele Anwendungen durchaus verließen) abgestellt wurde - was zur Inkompatibilität mit den kaputten alten Anwendungen führt(e), die sich auf kaputtes Verhalten stütz(t)en.

        Ich persönlich möchte jedoch keine Verantwortung für ein Projekt übernehmen, das unter MySQL 4.x noch eingesetzt werden muss. Ich rate aus Sicherheitsgründen dringend von aufwendiger Neuentwicklung für tote Versionen ab. Dies gilt für MySQL unter 5.0 genauso wie für PHP-4.x.

        Freundliche Grüße

        Vinzenz

        1. erweiterte Support für MySQL 4.0 ist inzwischen ausgelaufen. Wie wäre es mit einer Aktualisierung?

          Tja,
          leider habe ich keinen Einfluss auf die Datenbank Version die vom Hoster gestellt wird...

          Grüße,
          der Kurti

          1. Mahlzeit Kurti,

            leider habe ich keinen Einfluss auf die Datenbank Version die vom Hoster gestellt wird...

            Natürlich ... Du könntest z.B. den Hoster wechseln. Hoster, die eine antiquierte und vom Hersteller nicht mehr supportete Version einer Software produktiv einsetzen, sind im eigenen Interesse zu meiden.

            MfG,
            EKKi

            --
            sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
          2. echo $begrüßung;

            leider habe ich keinen Einfluss auf die Datenbank Version die vom Hoster gestellt wird...

            Manchmal ist aus Kompatibilitätsgründen zu alten Scripten _auch_noch_ eine alte Version von MySQL im Einsatz und eine neue lässt sich im Konfigurationstool des Hosters wählen. Wenn nicht, hast du zumindest die Möglichkeit, mit dem Hoster in Kontakt zu treten und nach einer aktuellen Version zu fragen.

            Unabhängig davon tät mich interessieren, wie Vinzenz (mit einer aktuellen Version) das Problem mit (einer) Unterabfrage(n) lösen wollen würde.

            echo "$verabschiedung $name";

  2. echo $begrüßung;

    arbeite mit MySql (niedrige 4er Version - glaub ich) und PHP 5

    Es gibt von MySQL 4 nur die Versionen 4.0 und 4.1. Beide unterscheiden sich aber erheblich. Jedoch ist dein Problem mit beiden Versionen nicht elegant lösbar, jedenfalls meines Wissens nach.

    Habe eine Tabelle mit Bestellungen und möchte aus dieser Tabelle die Top Ten Produkte je Land auswählen. Ich kann die Top Ten Produkte insgesamt wählen, und ich kann für jedes Land eine eigene Abfrage schreiben und mir die jeweiligen Top Ten ausgeben lassen, aber nicht für alle Länder...

    Auf letzteres wird es hinauslaufen. Zuerst die Länder ermitteln, dann einzeln die TopTen pro Land abfragen. Das ist nicht sehr schön, denn viele Abfragen bedeuten viel Overhead. Mit Prepared Statements (erhältlich ab MySQL 4.1 und mit PHPs mysqli-Extension) kannst du immerhin bei den wiederkehrenden Anfragen etwas Aufwand sparen.

    einfaches LIMIT 10 hilft da nicht ;-)

    LIMIT wirkt erst ganz am Ende. Wenn die Ergebnismenge schon feststeht, kann man die noch nach einer Anzahl einschränken. Gruppen zu je x Datensätzen zu bilden ist jedoch nicht möglich.

    Mit MySQL 5 könnte man den Vorgang in eine Stored Procedure packen, aber am Grundprinzip ändert sich dadurch nichts.

    echo "$verabschiedung $name";