mySQL: JOIN und ORDER BY

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

  • mySQL: JOIN und ORDER BY

    Hallo,

    ich habe zwei Tabellen:

    produkte (id, name, gruppe, rank)

    und produktverkauf (id, produktID, datum, preis)

    Um eine aktuelle preisliste der Produkte zuerstellen
    starte ich dezeit 2 bzw. 1+n Query's:

    pseudo:

    erg1 = SELECT id,name,beschreibung,gruppe,steuer FROM produkte WHERE status = '1' ORDER BY p.gruppe, p.rank

    while $erg1
    {
    erg2 = SELECT preis FROM produktverkauf WHERE produktID = 'erg1['id']' ORDER BY datum DESC LIMIT 0,1
    NAME: erg1['name'] - PREIS: erg2['preis']
    }

    Wie kann ich die n-Abfragen zu einer Abfrage umbauen?

    Das habe ich bis jetzt:
    SELECT p.id,p.name,p.beschreibung,p.gruppe,p.steuer FROM produkte p LEFT JOIN produktverkauf v ON p.id = v.produktID WHERE p.status = '1' && p.gruppe != 16 GROUP BY v.produktID ORDER BY p.gruppe, p.rank

    Probleme bereitet mir die ORDER BY Klausel.
    Wie kann ich festlegen, dass 'produktverkauf' nach datum DESC, also der neuste Preis genommen wird, aber tabelle 'produkte' bzw. das Gesamtergebnis jedoch nach p.gruppe, p.rank sortiert wird?

  • #2
    ... order by a asc, b desc, d asc ... usw. du kannst auch nach nicht selektierte Spalten sortieren

    Kommentar


    • #3
      Also ich habe jetzt folgende Query:

      $produktQuery = "SELECT p.id,p.name,p.beschreibung,p.gruppe,p.steuer,p.rank,v.preis FROM produkte p LEFT JOIN produktverkauf v ON p.id = v.produktID WHERE p.status = '1' && p.gruppe != 16 GROUP BY v.produktID ORDER BY v.datum DESC, p.gruppe ASC, p.rank ASC";

      und das ergbnis ist folgendes:

      ID: 24, PREIS: 181, GRUPPE: 1, RANK: 2
      ID: 70, PREIS: 181, GRUPPE: 1, RANK: 4
      ID: 32, PREIS: 60, GRUPPE: 3, RANK: 1
      ID: 100, PREIS: 60, GRUPPE: 3, RANK: 2
      ID: 33, PREIS: 56, GRUPPE: 3, RANK: 4
      ...
      ID: 99, PREIS: 672, GRUPPE: 11, RANK: 14
      ID: 82, PREIS: 2457, GRUPPE: 11, RANK: 15
      ID: 22, PREIS: 190, GRUPPE: 1, RANK: 1
      ...
      ID: 210, PREIS: 374, GRUPPE: 15, RANK: 43
      ID: 101, PREIS: , GRUPPE: 12, RANK: 20

      Eigentlich soll alles aufsteigend (also kleinste gruppenID zuerst)
      aufgelistet werden. Wie aber zu erkennen ist, ist beispielsweise nach gruppenID 11 nochmal die GruppenID 1 am start. Wie kommt das?

      Hier meine beiden Tabellen:

      CREATE TABLE `produkte` (
      `id` mediumint(6) NOT NULL auto_increment,
      `name` varchar(50) collate latin1_general_ci NOT NULL default '',
      `beschreibung` varchar(250) collate latin1_general_ci NOT NULL default '',
      `gruppe` tinyint(3) NOT NULL default '0',
      `status` char(1) collate latin1_general_ci NOT NULL default '0',
      `rank` tinyint(3) default '20',
      `steuer` char(2) collate latin1_general_ci NOT NULL default '16',
      PRIMARY KEY (`id`)
      ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=262 ;

      CREATE TABLE `produktverkauf` (
      `id` int(9) NOT NULL auto_increment,
      `produktID` int(9) NOT NULL default '0',
      `datum` int(10) NOT NULL default '0',
      `preis` varchar(6) collate latin1_general_ci NOT NULL default '',
      `pfand` varchar(5) collate latin1_general_ci default NULL,
      PRIMARY KEY (`id`)
      ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=162 ;
      EDIT:
      Bitte das nächste Mal weniger Ergebnis posten!
      Zuletzt geändert von asp2php; 23.12.2005, 22:02.

      Kommentar


      • #4
        Puh, ich habe den Thread nicht gelesen, aber war es wirklich nötig, das gesamte Resultset zu posten?

        Kommentar


        • #5
          weil du zuerst nach Datum sortiert hast, nimm Datum in dein Select mit auf, dann siehst du schon

          Kommentar


          • #6
            weil du zuerst nach Datum sortiert hast, nimm Datum in dein Select mit auf, dann siehst du schon
            Ja, hast recht.
            Aber wie soll ich denn sonst sortieren?
            Ich meine in der Tabelle 'produktverkauf' gibt es mehrere Datensätze mit derselben produktID, aber es soll der neuste (zuvor mit ORDER BY produktverkauf.datum DESC bestimmt) genommen werden..

            Wie gehtn das?


            BTW: werde beim zukünftigen posten drauf achten..

            Kommentar


            • #7
              welche MySQL-Version hast du? Kann das Teil mit Sub-Select umgehen?

              Kommentar


              • #8
                MySQL: 4..1.11

                Das habe ich auf mysql gefunden:

                2.8.2. Dinge, die in naher Zukunft erledigt werden müssen
                Unteranfragen (Subqueries). select id from t where grp in (select grp from g where u > 100)

                Gibts nicht irgendwas wie max (produktverkauf.datum) für den JOIN, was ich als bedingung einbauen könnte?

                Kommentar


                • #9
                  genau, max ist das Zauberwort . Mach ein Subselect bestimme dabei max(datum) und gruppiere nach ProduktId, dann das Ergebnis mit der/den normalen Tabelle Joinen dann bist du am Ziel.

                  Kommentar


                  • #10
                    ohne subselect gehts nicht? Wo hast Du gelesen, dass meine Version subselcet unterstützt?

                    Kommentar


                    • #11
                      Original geschrieben von westberlin
                      ohne subselect gehts nicht?
                      doch, aber heut' ist Weihnachten, 2006 schau ich dann drüber
                      Wo hast Du gelesen, dass meine Version subselcet unterstützt?
                      wo hab' ich das gesagt

                      Kommentar


                      • #12
                        wo hab' ich das gesagt
                        '...mach ein SubSelect...'
                        war Deine Antwort auf mein 'MySQL: 4..1.11...'

                        Ein Glück is heut Weihnachten...

                        Kommentar

                        Lädt...
                        X