php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 07.10.2010, 14:52  
Neuer Benutzer
 
Registriert seit: 07.10.2010
Beiträge: 7
PHP-Kenntnisse:
Fortgeschritten
madmix befindet sich auf einem aufstrebenden Ast
Standard DB Abfrageproblem

Hallo Com

Ich habe ein riesen Problem, an dem ich langsam zu verzweifeln drohe.
Ich soll einen Belegzeitenkalender auslesen und die buchbaren Tage anzeigen lassen.
Alles dreht sich hier um Ferienobjekte, die zu bestimmten Zeiten belegt sind, aber zwischen den Belegungen noch Kapazitäten frei haben.
Der Suchende gibt nun eine Zeitraum ein von wann bis wann er in etwa Urlaub geplant hat und möchte in dieser Zeit nur eine bestimmte Anzahl von Tagen dort verweilen.

Er gibt also in eine Suchmaske die drei Daten ein und erwartet ein entsprechendes Ergebnis.

Ich habe jetzt eine Funktion geschrieben die mir alle Belegungen aus der Tabelle ausliest und das letzte Belegungsdatum zurückgibt.
Das klappt bis hierhin auch schon ganz gut.

Nun zu dem Problem.
In der Belegungstabelle sind folgende Daten vorhanden
Belegt von 20101013 bis 20101020 und 20101023 bis 20101030
Gesucht wird der Zeitraum 20101015 - 201026 wo 7 Tage frei sein sollten.

Meine Funktion findet nun das Datum 20101020 und gibt mir dieses zurück, weil der nächste Zeitraum größer ist als das angeforderte.

Jetzt möchte ich aber auch den letzten Eintrag haben und quasi die Anzahl der freien Tage zwischen dem 20101020 - 20101023 ermitteln.
Ist dieser Wert nun kleiner als die geforderten Tage so soll mir dieses Objekt nicht zurückgegebn werden.

Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt.

Hier mal die Funktion:
(Wundert euch nicht über die Tabellenfeldnamen, ist nicht von mir, ich arbeite quasi auf einer DB die ich nicht selbst erstellt habe)

PHP-Code:
  // Zeige alle Objekte an die irgend was frei haben im genannten Zeitraum
  
public static function test($objectId,$dayFrom,$dayTo,$realDay) {

    
$qry_belegt="SELECT
            *
          FROM
            vakanzen
          WHERE
            objekt_nr='"
.$objectId."'
          AND
            ((von <= '"
.$dayFrom."' AND bis >= '".$dayFrom."')
          OR
            (von <= '"
.$dayTo."' AND '".$dayTo."' >= '".$dayTo."')
          OR
            ('"
.$dayFrom."' <= von AND '".$dayTo."' >= bis))
          ORDER BY
            bis ASC    
    "
;

    
$res_belegt mysql_query($qry_belegt);
    while(
$row mysql_fetch_array($res_belegt)) {
      if(
Search::getTimestamp($row["bis"]) >= Search::getTimestamp($dayTo)) { // Timestamp ermitteln und vergleichen
        
continue;
      } else {
        
$obj $row["objekt_nr"];
      }
    }
    return 
$obj;
  }

  public static function 
getTimestamp($date) {
    
$y substr($date,0,4);
    
$m substr($date,4,2);
    
$d substr($date,6,2);
   
    return 
strtotime($y."-".$m."-".$d);
  } 
Ich denke das ist ein Abfragproblem, bin aber im Moment dermaßen vernagelt im Kopf das ich nicht auf die Lösung komme.
Ich habe es schon mit folgender Variante versucht, was aber nicht hinhaut:

PHP-Code:
// Timestamp Datum von bis aus DB
$bis Search::getTimestamp($row["bis"]);
// Timestamp Datum Übergabe
$dayBis Search::getTimestamp($dayTo);
// Abfrage ob das letzte Buchungsdatum größer als die Übergabe ist
if($bis <= $dayBis) {
   
//Abfrage ob Tage übereinstimmen
  
$frei $dayBis $bis;
  
$test $frei 86400;
  if(
$test $realDay) {
    
$obj $row["objekt_nr"];
    
$b date("d.m.Y",$bis);
  }

Ich bin dankbar über jegliche Art der Hilfe oder Anregung wie man das Problem am besten angeht.

MfG Mad

Geändert von madmix (07.10.2010 um 14:55 Uhr).
madmix ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 07.10.2010, 15:16  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Wie wäre es wenn du eine Abfrage baust, die dir in einer Zeile zu einer Buchung jeweils auch das startdatum der nächsten Buchung anzeigt? Also einen JOIN von auf die selbe Tabelle
cycap ist offline   Mit Zitat antworten
Alt 07.10.2010, 15:41  
Neuer Benutzer
 
Registriert seit: 07.10.2010
Beiträge: 7
PHP-Kenntnisse:
Fortgeschritten
madmix befindet sich auf einem aufstrebenden Ast
Standard

Wie das???

Ich bekomme doch nur einen Datensatz heraus bei meiner Abfrage, wie kann ich den mit JOIN (inner oder outer) gleichzeitig den nächsten auslesen...
und funzt das überhaupt mit JOIN auf dieselbe Tabelle zuzugreifen ??

Gehirnblockade
madmix ist offline   Mit Zitat antworten
Alt 07.10.2010, 15:51  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Code:
SELECT a.*,MIN(b.von) as next_von FROM table AS a
LEFT JOIN table AS b
ON a.objekt_nr = b.object_nr
  AND b.von > a.von
GROUP BY a.id
cycap ist offline   Mit Zitat antworten
Alt 07.10.2010, 16:11  
Neuer Benutzer
 
Registriert seit: 07.10.2010
Beiträge: 7
PHP-Kenntnisse:
Fortgeschritten
madmix befindet sich auf einem aufstrebenden Ast
Standard

Tschuldige, dass ich dich nochmal nerven tu, aber wo oder wie übergebe ich den die WHERE Klausel.
Ich muss dabei sagen das ich bisher nicht mit JOIN gearbeitet habe (meist hats auch eine zweite Abfrage getan)
madmix ist offline   Mit Zitat antworten
Alt 07.10.2010, 16:28  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

vor dem Group by , wenn du dein Where überhaupt noch brauchst mit seiner Abfrage

hast du seine Abfrage mal ausprobiert , ob die nicht ganz und gar ausreichend ist ?
eagle275 ist offline   Mit Zitat antworten
Alt 07.10.2010, 16:33  
Neuer Benutzer
 
Registriert seit: 07.10.2010
Beiträge: 7
PHP-Kenntnisse:
Fortgeschritten
madmix befindet sich auf einem aufstrebenden Ast
Standard

Ja hab ich, bekomme die Meldung das Feld object_id ist mehrdeutig

SQL-Befehl: Dokumentation

SELECT a. * , MIN( b.von ) AS next_von
FROM 'table' AS a
LEFT JOIN 'table' AS b ON a.objekt_nr = b.object_nr
AND b.von > a.von
WHERE objekt_nr = '283'
AND (
(
von <= '20101007'
AND bis >= '20101007'
)
OR (
von <= '20101021'
AND '20101021' >= '20101021'
)
OR (
'20101007' <= von
AND '20101021' >= bis
)
)
GROUP BY a.id
LIMIT 0 , 30

MySQL meldet: Dokumentation
#1052 - Column 'objekt_nr' in where clause is ambiguous

Das gleiche ohne WHERE

Geändert von madmix (07.10.2010 um 16:38 Uhr).
madmix ist offline   Mit Zitat antworten
Alt 07.10.2010, 16:38  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

wo steht bei dir object_id ?

in seiner Abfrage jedenfalls ist es nicht drin - wenn ich die umbaue für dein Where ... sollte die immer noch nicht mehrdeutig sein

Code:
SELECT a.*,MIN(b.von) as next_von FROM vakanzen AS a
LEFT JOIN vakanzen AS b
ON a.objekt_nr = b.object_nr
  AND b.von > a.von
WHERE a.objekt_nr='".$object_id."'
GROUP BY a.id
eagle275 ist offline   Mit Zitat antworten
Alt 07.10.2010, 16:47  
Neuer Benutzer
 
Registriert seit: 07.10.2010
Beiträge: 7
PHP-Kenntnisse:
Fortgeschritten
madmix befindet sich auf einem aufstrebenden Ast
Standard

Tschuldige vertippt, sollte natürlich objekt_nr sein......
madmix ist offline   Mit Zitat antworten
Alt 07.10.2010, 16:52  
Moderator
 
Benutzerbild von cycap
 
Registriert seit: 13.02.2008
Beiträge: 6.816
PHP-Kenntnisse:
Fortgeschritten
cycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nettcycap ist einfach richtig nett
Standard

Du musst überall angeben welche Tabelle du meinst. Durch das joinen auf die gleiche Tabelle hast du natürlich auch alle Felder doppelt, deswegen immer ein a. oder ein b. davor schreiben
cycap ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Abfrageproblem VitaminC Datenbanken 5 01.05.2009 08:17
Abfrageproblem d-jango Datenbanken 2 16.11.2006 11:09
Abfrageproblem Datenbanken 6 24.07.2006 18:28
[Erledigt] Abfrageproblem mit Inner Join Datenbanken 15 29.11.2005 18:17
[Erledigt] Abfrageproblem: Select * from x,y where ... Datenbanken 6 11.04.2005 08:32
MySQL Abfrageproblem Datenbanken 5 07.02.2005 20:02
[Erledigt] Abfrageproblem Datenbanken 3 04.02.2005 12:40
[Erledigt] Abfrageproblem Datenbanken 8 26.12.2004 13:48
Abfrageproblem Datenbanken 4 21.12.2004 12:24
Abfrageproblem PHP Tipps 2004 8 21.09.2004 16:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
phpbb sql befehl left join, http://www.php.de/php-fortgeschrittene/72600-db-abfrageproblem.html, test

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:35 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum