[MySQL 3.23.X] Limit bei SQL-Abfrage mit Join

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

  • [MySQL 3.23.X] Limit bei SQL-Abfrage mit Join

    Hallo,

    ich hole mit dem nachfolgendem SQL-Befehl meine Daten aus meiner Datenbank, was soweit auch sehr gut funktioniert. Einziges Problem ist, dass in der Tabelle "kommentare t3" für jede "info_id" mehrere Einträge existieren. Es soll jedoch nur der jeweils aktuellste Kommentar bzw. Eintrag ausgelesen werden.

    PHP-Code:
        $query mysql_query("SELECT
        t1.kundenname, t1.abrechnungsart, t1.abrechnungsvariante, t1.fachrichtung, t1.priorität,
        t2.id, t2.kd_nr, t2.eingangsdatum, t2.versandart, t2.bearbeitungsdatum, t2.status,
        t3.info_id, t3.datum, t3.kommentar, t3.bearbeiter
    FROM kundenliste t1 RIGHT JOIN kundeninfo t2 ON t1.kd_nr = t2.kd_nr
    LEFT JOIN kommentare t3 ON t2.id = t3.info_id WHERE t2.eingangsdatum='
    $today' AND t2.status!='2'
    ORDER BY t2.kd_nr ASC, t3.id DESC"
    ) and $i++; 
    Ich hoffe ihr könnt mir da vielleicht weiterhelfen.

    Besten Dank im Voraus
    Zuletzt geändert von Lacoste; 18.07.2005, 14:42.

  • #2
    1. Ließ bitte die Regeln
    2. Brich bitte deinen Text um, so das auf ner 1024er Auflösung kein Scrollbalken entsteht.
    3. ORDER BY und LIMIT sollten dir helfen....

    Der Trick ist es absteigen nach Datum zu sortieren und sich nur den ersten Datensatz ausgeben zu lassen.

    Kommentar


    • #3
      Der Trick ist es absteigen nach Datum zu sortieren und sich nur den ersten Datensatz ausgeben zu lassen.
      nein, so wird es nicht funktionieren.

      http://dev.mysql.com/doc/mysql/en/ex...group-row.html
      Die Zeit hat ihre Kinder längst gefressen

      Kommentar


      • #4
        In standard SQL (and as of MySQL 4.1), the problem can be solved....

        Leider arbeite ich mit MySQL 3.23.58 und habe keine Möglichkeit eine neuere Version zu installieren.

        Ansonsten war der Ansatz von "derHund" glaub ich schon der Richtige. Während ich mit Order By und Limit keine Chance sehe das Ganze zu realisieren.

        Kommentar


        • #5
          Du musst die Seite schon bis zum Ende lesen, da steht
          Posted by Csaba Gabor on March 16 2003 9:16am
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            Vielleicht hab ich was überlesen, aber warum sollte es nicht gehn, ich hab ein Ergebniss nachdem ich ordern kann und demzufolge auch limiten - erleuchtet mich...

            Kommentar


            • #7
              Sorry, wollte deine Antwort nicht abwerten, ich hab allerdings mit LIMIT und ORDER BY schon einiges ausprobiert und hab's nicht hinbekommen, aber wenn du so nett wärst und deine Vorstellungen in meinen Code einbauen würdest, würde ich deinen Code gerne ausprobieren.

              Zu derHund: Ich muss ganz ehrlich sagen, ich kapier die Alternative nicht.

              SELECT article,
              SUBSTRING( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 7) AS dealer,
              0.00+LEFT( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
              FROM shop
              GROUP BY article;

              Kannst du mir vielleicht noch einen Tipp geben? Vielleicht überseh ich auch nur was.

              Kommentar


              • #8
                @prego

                Er hat sinngemäß sowas:

                info_id 1
                kommentare: 1 (17:00), 2 (18:00), 3 (18:15)

                info_id 2
                kommentare: 4 (15:25), 5 (18:05)

                info_id 3
                kommentare: 6 (18:07), 15 (18:10)

                Er will:
                info_id 1 - kommentar 3
                info_id 3 - kommentar 15
                info_id 2 - kommentar 5

                Wenn er nur sortiert und LIMITiert, bekommt er
                info_id 1 - kommentar 3
                info_id 3 - kommentar 15
                info_id 3 - kommentar 6

                Klar?
                Ich denke, also bin ich. - Einige sind trotzdem...

                Kommentar


                • #9
                  Ach, danke - ich dachte er wöllte generell nur den neusten Eintrag, nicht pro Gruppe.... okok, dann funktioniert meins natürlich nicht.

                  Kommentar


                  • #10
                    Sorry, aber ich bekomm's nicht hin, kann mir jemand meinen Code etwas anpassen? Ich bin echt am Ende.

                    Kommentar


                    • #11
                      Original geschrieben von mrhappiness
                      Du musst die Seite schon bis zum Ende lesen, da steht
                      Posted by Csaba Gabor on March 16 2003 9:16am
                      Poste doch mal deine darauf basierenden Versuche
                      Ich denke, also bin ich. - Einige sind trotzdem...

                      Kommentar


                      • #12
                        Hier steig ich ehrlich gesagt nicht ganz durch, da ich nicht weiss woher markierten (fett) Werte kommen.

                        SELECT article,
                        SUBSTRING( MAX( CONCAT(LPAD(price,6 ,'0'),dealer) ), 7) AS dealer,
                        0.00+LEFT( MAX( CONCAT(LPAD(price,6,'0'),dealer) ), 6) AS price
                        FROM shop
                        GROUP BY article;

                        +---------+--------+-------+
                        | article | dealer | price |
                        +---------+--------+-------+
                        | 0001 | B | 3.99 |
                        | 0002 | A | 10.99 |
                        | 0003 | C | 1.69 |
                        | 0004 | D | 19.95 |
                        +---------+--------+-------+

                        Davon abgesehen geht es bei mir um die ID und nicht um den Price.

                        Kommentar


                        • #13
                          Wenn du nicht in der Lage bist, auf einer Webseite nach dem Text Gabor zu suchen um das finden, was ich meine, dann kann dir keiner mehr helfen...
                          Ich denke, also bin ich. - Einige sind trotzdem...

                          Kommentar


                          • #14
                            grml, manchmal tuts echt weh ...
                            Posted by Csaba Gabor on March 16 2003 9:44am
                            [...]
                            To find the most recent entry (the entry with the highest Id) for each Item, where the Item does not currently have a Deleted status, we could use:

                            SELECT t1.*
                            FROM Tracker AS t1 LEFT JOIN Tracker AS t2
                            ON t1.Item=t2.Item AND t1.Id<t2.Id
                            WHERE t2.Id IS NULL AND t1.Status!='Deleted'

                            Enjoy,
                            Csaba Gabor from New York
                            prinzip: tabelle wird mit sich selbst (links) gejoint, dort wo die info_ids übereinstimmen und wo das zweite datum größer dem ersten ist. da für das größte datum aus eins kein größeres in zwei existiert, wird dort mit NULL aufgefüllt. diese zeilen selectierst du und hast damit für jede info_id den aktuellsten eintrag.
                            Die Zeit hat ihre Kinder längst gefressen

                            Kommentar


                            • #15
                              Also ich hab meinen Code jetzt wie folgt abgeändert, funktioniert aber nicht. Jetzt gibt er mir gar nichts mehr aus.

                              PHP-Code:
                              $query mysql_query("SELECT
                                  t1.kundenname, t1.abrechnungsart, t1.abrechnungsvariante, t1.fachrichtung, t1.priorität,
                                  t2.id, t2.kd_nr, t2.eingangsdatum, t2.versandart, t2.bearbeitungsdatum, t2.status,
                                  t3.info_id, t3.datum, t3.kommentar, t3.bearbeiter
                              FROM kundenliste t1
                              LEFT JOIN kundeninfo t2 ON t1.kd_nr = t2.kd_nr
                              RIGHT JOIN kommentare t3 ON t2.id = t3.info_id
                              INNER JOIN kommentare t4 ON t3.info_id=t4.info_id AND t3.id<t4.id
                              WHERE t4.id IS NULL AND t3.info_id!='Deleted'
                              AND t2.eingangsdatum='
                              $today'
                              AND t2.status!='2'
                              ORDER BY t2.kd_nr ASC, t3.id DESC"
                              ) and $i++; 
                              Könnte mir vorstellen, dass es evtl. am INNER JOIN liegt, weiss aber nicht wie ich das sonst machen soll. Kann mir vielleicht jemand nen Tipp geben?

                              Kommentar

                              Lädt...
                              X