joins, group by & order by

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

  • joins, group by & order by

    ich hab die folgenden tabellen: "avail" und "numbers"
    numbers ist eine hilfstabelle die ich brauche um die sortierung zu ermöglichen - hat man mir in einem chat gesagt..
    avail beinhaltet die verfügbarkeiten des raums: crdate steht dabei für das erstellungsdatum

    ich habe mir nun folgenden code zusammen gestöpselt:
    PHP-Code:
    SELECT numbers.numavail.startdateavail.enddateavail.numberrooms
    FROM 
    (
        
    SELECT num
        FROM numbers
        WHERE num
        BETWEEN 
    (
            
    SELECT MINavail.startdate )
            
    FROM avail
        
    )
        AND (
            
    SELECT MAXavail.enddate )
            
    FROM avail
        
    )
    ) AS 
    numbers

    JOIN avail ON num
    BETWEEN avail
    .startdate
    AND avail.enddate

    LEFT JOIN avail t1 ON num
    BETWEEN t1
    .startdate
    AND t1.enddate
    AND avail.startdate t1.startdate

    ORDER BY numbers
    .num ASC avail.crdate DESC 
    aber wie man unten an den beiden letzten tabellen sieht, bin ich noch nicht am ziel.. wo muss ich da noch was einbauen damit ich zu meinem soll zustand (es soll immer nur der neuere eintrag hergenommen werden) komme?
    hab mich schon mit distinct und group by gespielt, aber beides erzielt (zumindest in meinen versuchen) nicht das gewünschte ergebnis..

    hoffe man kann mir helfen
    gruß
    david


  • #2
    ähm ... vielleicht gibst du mal Tabellenstrukturen an und sagt was Soll-Ergebnis wäre ... deine Abfrage ist etwas wüst

    Kommentar


    • #3
      sry

      folgende aufgabenstellung:
      ich habe die tabelle "avail" welche 4 spalten beinhaltet:
      1. crdate (date of creation)
      2. startdate
      3. enddate
      4. numberrooms (number of available rooms)

      er soll mir aus dieser nun die tabelle "output" generieren die mindestens 2 spalten benötigt:
      1. date
      2. numberrooms

      - er soll beim generieren die tabelle avail auswerten,
      - er soll jeden tag im (in einer variable) übergebenen jahr anführen (zb 2008)
      - er soll für jeden tag prüfen wieviele zimmer verfügbar sind
      - falls ein tag 2mal in der tabelle avail vorhanden ist, dann soll er den neueren (crdate) datensatz nehmen
      - falls ein tag in der tabelle avail nicht vorhanden ist, dann soll er den wert aus der tabelle basic nehmen


      grafische darstellung der tabellen:



      jemand eine idee?
      gruß
      david

      Kommentar


      • #4
        Deine Ausführungen werfen noch viel mehr Fragen auf:[list=1][*]Sehe ich kein einziges Datum in deiner Tabelle[*]Wozu soll id gut sein, wenn es nicht UNIQUE, bzw PRIMARY KEY ist?[*]Falls die enthaltenen INTEGERs Timestamps sein sollten (warum auch immer), welches dieser drei Daten soll im Output erscheinen?[*]was heisst «wenn ein Tag nicht vorhanden ist»[/list=1]
        Gruss
        H2O

        Kommentar


        • #5
          sry diese infos hab ich leider vergessen..

          # Sehe ich kein einziges Datum in deiner Tabelle
          all die integer werte sind timestamps (timestamps deswegen weil typo3 dies vorgibt)

          # Wozu soll id gut sein, wenn es nicht UNIQUE, bzw PRIMARY KEY ist?
          da hast du vollkommen recht. hab es jetzt so dargestellt, dass die id's auch unique sind

          # Falls die enthaltenen INTEGERs Timestamps sein sollten (warum auch immer), welches dieser drei Daten soll im Output erscheinen?
          keine der drei daten soll ausgegen werden.. es soll eben eine tageweise aufzählung gemacht werden - hab nun eine tabelle "einzelneTage" hinzugefügt (im anfangsposting tabelle "numbers"), welche einfach nur eine liste von tages-timestamps enthält - falls dies denn nötig ist

          # was heisst «wenn ein Tag nicht vorhanden ist»
          er soll bei einem gewissen tag (zb 1.1.2008 / als timestamp: 1199142000) anfangen und dann tageweise jeweils checken ob der tag zwischen eines der start- und enddaten in der tabelle "avail" fällt.
          falls nein: er nimmt für den tag den basic output (in diesem fall: 6) her
          falls ja: fällt er bei einem oder bei mehreren datensätzen hinein
          ..bei einem: er nimmt den numberrooms wert
          ..bei mehreren: er nimmt den numberroms wert des neueren datensatzes her

          verbesserte version
          die tabelle "einzelneTage" ist wie gesagt nur eine hilfstabelle, wobei ich nicht weiß ob sie existieren muss oder nicht


          hoffe ich hab nicht noch was vergessen, weil sonst wirds peinlich für mich

          Kommentar


          • #6
            Was du dann aus der Tabelle basic holen willst ist immer noch völlig unklar. Natürlich, wenn, wie in deinem Beispiel, nur ein Wert drin ist, gehts, aber da kannst du auch gleich eine Konstante nehmen. Aber sonst?
            Die Abfrage auf den neusten Eintrag geht aber schon:
            Code:
            SELECT
            	numberrooms
            FROM
            	avail 
            WHERE
            	$datum BETWEEN startdate AND enddate
            ORDER BY
            	crdate DESC
            LIMIT 1;
            Gruss
            H2O

            Kommentar


            • #7
              h2o: danke für deine geduld, dein ansatz ist aber leider nicht passend.

              ich versuchs nochmals mit worten zu erklären..

              also es geht um zimmerverfügbarkeiten.


              ich habe mehrere zimmerarten
              -- zb doppelzimmer, einzelzimmer,..

              jede zimmerart hat eine grundverfügbarkeit
              -- zb es gibt grundsätzlich 5 doppelzimmer die gebucht werden können

              jede zimmerart soll neben dieser grundverfügbarkeit beliebig viele andere verfügbarkeiten haben
              -- da die zimmer nicht nur per internet gebucht werden können sondern auch direkt vor ort.. ist zb auch wichtig wenn man weiß man hat im januar einen kongress wo sowieso 4 doppelzimmer fix gebucht sind. hat den sinn, dass man dann über internet in diesem falle nur mehr 1 doppelzimmer buchen kann

              der hotelier kann auserdem sagen ok generell hab ich im märz zb 2 doppelzimmer zur verfügung. jetzt erfährt er aber kurzfristig, dass er in der woche um den 15. märz nur 1 zimmer zur verfügung hat. damit er jetzt nicht seinen bereits getätigten eintrag ändern muss, soll er praktisch einfach den alten eintrag teilweise (nämlich in der woche um den 15. märz) überschreiben können

              damit der hotelier nun weiß wieviele zimmer er wann frei hat, bekommt er für jedes zimmer eine übersicht, wo er alle 365 tage des jahres sieht, wo dann bei jedem tag dabei steht wieviele doppelzimmer er zb am 15.märz verfügbar hat.
              -- das ergebnis in diesem falle wäre dank der letzten änderung wäre: 1 doppelzimmer ist verfügbar

              pfuh viel text, aber hoffentlich erklärt es das nun besser als meine vorangegangenen einträge

              gruß
              david

              Kommentar


              • #8
                Genau diesen Ansatz habe ich dir ja geliefert. Du musst das dann natürlich für jeden gewünschten Tag aufrufen.
                Nur die verschiedenen Zimmerarten sind bis jetzt nicht vorgekommen, die existieren auch in deinem Datenmodell nicht.
                Gruss
                H2O

                Kommentar


                • #9
                  mh, das hieße aber ich müsste deinen query 365mal aufrufen um die seite zu laden.. hieße das nicht ziemlicher performance verbrauch?

                  oder verstehe ich da was falsch?

                  Kommentar


                  • #10
                    Warum 365 mal? Einfach soviel mal, wie du Tage voraussehen willst. Ich denke kaum, dass es sinn macht, ein ganzes jahr voraus zu gehen. Du kannst das Ganze natürlich auch in eine Storede Procedure mit den Paramtern Start-Datum und End-Datum packen. Dann hast du auch nur einen Aufruf und bist mit der Periode trotzdem flexibel.

                    PS
                    Das das Datum wegen Typo3 als Integer gespeichert werden muss, halte ich - trotz des gelegentlich «speziellen» DB-Designs dieses CMS's - für ein Gerücht. Das würde es ja einen Redaktor prakisch verunmöglichen, ein Datum einzugeben.
                    Gruss
                    H2O

                    Kommentar


                    • #11
                      in diesem speziellen fall soll es aber für den hotelier eine jahresübersicht sein, und damit muss er es eben so oft aufrufen..
                      deswegen wäre mir auch eine sql abfrage lieber, die das ganze in eine liste speichert. wo ich dann nur noch sagen muss er soll mir den inhalt der tabelle von 0-364 ausgeben

                      typo3 speichert es als integer ab.. was nicht heißt dass ein redakteur es nicht ganz normal a la "7-7-2008" eingeben kann - da findet anscheinend eine umwandlung statt

                      danke trotzdem für deine hilfe

                      Kommentar


                      • #12
                        Was sind schon 365 Aufrufe? Andernfalls musst du möglicherweise zuerst eine Jahrestabelle erstellen. Das sind dan 365 Inserts.
                        Aber wie gesagt, ich würde es in eine Prozedur packen, dann ist es auch nur ein Aufruf, ist vermutlich schnell und du bist flexibel. Wenn der Hotelier merkt, dass vielleicht eine Monatsauswertung sinnvoller wäre, ist das auch schon drin.
                        Gruss
                        H2O

                        Kommentar


                        • #13
                          Tipp: du machst eine Unterabfrage zwischen den Tabellen avail und einzelnetage, das Ergebnis bildest du mit right join auf basic bei der Ausgabe prüfst du mit IF (oder CASE WHEN) numberrooms vom Subselect, wenn is null dann von basic nehmen, wenn nicht dann von subselect

                          Pseudo Abfrage

                          select ..., case when a.numberrooms is null then b.bnumber else a.numberrooms end as numberrooms from (select .... from einzelnetage inner join avail on ...) as a right join basic as b on a.bid=b.bid)
                          Zuletzt geändert von asp2php; 24.07.2008, 21:58.

                          Kommentar

                          Lädt...
                          X