php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 22-07-2008, 18:13
david_bru
 Newbie
Links : Onlinestatus : david_bru ist offline
Registriert seit: Jul 2008
Beiträge: 10
david_bru ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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

Mit Zitat antworten
  #2 (permalink)  
Alt 22-07-2008, 21:03
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ähm ... vielleicht gibst du mal Tabellenstrukturen an und sagt was Soll-Ergebnis wäre ... deine Abfrage ist etwas wüst
Mit Zitat antworten
  #3 (permalink)  
Alt 23-07-2008, 10:36
david_bru
 Newbie
Links : Onlinestatus : david_bru ist offline
Registriert seit: Jul 2008
Beiträge: 10
david_bru ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #4 (permalink)  
Alt 23-07-2008, 10:55
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #5 (permalink)  
Alt 23-07-2008, 12:12
david_bru
 Newbie
Links : Onlinestatus : david_bru ist offline
Registriert seit: Jul 2008
Beiträge: 10
david_bru ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #6 (permalink)  
Alt 23-07-2008, 13:55
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #7 (permalink)  
Alt 23-07-2008, 15:53
david_bru
 Newbie
Links : Onlinestatus : david_bru ist offline
Registriert seit: Jul 2008
Beiträge: 10
david_bru ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #8 (permalink)  
Alt 23-07-2008, 16:03
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #9 (permalink)  
Alt 23-07-2008, 16:49
david_bru
 Newbie
Links : Onlinestatus : david_bru ist offline
Registriert seit: Jul 2008
Beiträge: 10
david_bru ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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?
Mit Zitat antworten
  #10 (permalink)  
Alt 24-07-2008, 08:27
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #11 (permalink)  
Alt 24-07-2008, 08:34
david_bru
 Newbie
Links : Onlinestatus : david_bru ist offline
Registriert seit: Jul 2008
Beiträge: 10
david_bru ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #12 (permalink)  
Alt 24-07-2008, 09:13
H2O
 PHP Junior
Links : Onlinestatus : H2O ist offline
Registriert seit: Jul 2007
Beiträge: 937
H2O ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Mit Zitat antworten
  #13 (permalink)  
Alt 24-07-2008, 21:54
asp2php
 Banned
Links : Onlinestatus : asp2php ist offline
Registriert seit: Feb 2004
Beiträge: 11.745
asp2php ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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)

Geändert von asp2php (24-07-2008 um 21:58 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:17 Uhr.