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 21-02-2005, 12:17
protogue
 Newbie
Links : Onlinestatus : protogue ist offline
Registriert seit: Oct 2004
Beiträge: 9
protogue ist zur Zeit noch ein unbeschriebenes Blatt
Lightbulb kobinierte abfrage - zeige die, die nicht zutreffen

hallo leute,
ich bin noch ziemlich neu und am rumprobieren, was abfragen mit sql und php angeht. einfache abfragen kriege ich schon ganz gut hin - aber jetzt stehe ich echt vor einem problem, welches mich schon tagelang beschäftigt und ich keinen lösungsansatz hinbekomme.

also es geht um eine suche von freien objekten in einem bestimmten zeitraum. einen belegungsplan habe ich mir schon von einem tollen script umgebastelt - aber jetzt will ich nach freien objekten suchen!!

es gibt folgende tabelle buchung (vereinfachte form - in datum wird dann mit funktion date gerechnet) - datum zeigt die besetzten tage - also z.B. 1 wäre der 1.Mai und 2 der 2.Mai usw.:

| objekt_id | datum |
| 401 | 1 |
| 401 | 2 |
| 401 | 3 |
| 401 | 8 |
| 401 | 9 |
| 402 | 3 |
| 402 | 4 |
| 402 | 5 |
| 402 | 11 |
| 402 | 12 |
| 402 | 11 |
| 403 | 1 |
| 403 | 2 |
| 403 | 3 |
| 403 | 8 |
| 403 | 9 |
| 40X | usw. |


jetzt möchte ich abfragen, welches objekt in diesem zeitraum besetzt ist - und mir dann alle anderen anzeigen lassen - außer den besetzten.
wenn jetzt nur das objekt in dem bestimmten zeitraum in der tabelle wäre, ist das kein problem, aber es sind ja auch noch andere zeiten von diesem objekt belegt und diese würden mir ja dann auch angezeigt - das will ich ja gerade nicht !!

wie muss ich die abfrage stellen?

bisher habe ich:


PHP-Code:

//datum ist hier vereinfacht als zahl dargestellt - also 1 wäre hier der 1.

 
$start"5";
 
$ende="8";

mysql_connect("XXXXX","XXXX","XXXX") or die
  (
"Keine Verbindung moeglich");
    
mysql_select_db("XXXX") or die ("Die Datenbank existiert nicht");

 
$anfrage="
 SELECT * FROM 
 buchung
 WHERE
 datum
 BETWEEN
 '$start'
 AND
 '$ende'
 GROUP BY objekt_id
 "
;

 
$ergebnis=mysql_query($anfrage);
 
$anz=mysql_num_rows($ergebnis);
 print (
"<p><strong>Anzahl der Treffer: </strong>");
 print (
$anz);
 for (
$a=$anz-1;$a>-1$a--) {
   
mysql_data_seek ($ergebnis$a);
   
$zeile=mysql_fetch_row($ergebnis);
   print (
"<tr align='center'>");
   print (
"<td>");
   print (
"<a href='r1.php?id=");
   print (
$zeile[0]);
   print (
"'>");
   print (
$zeile[0]);
   print (
"</a>");
   print (
"</td>");
   print (
"<td>");
   print (
$zeile[1]);
   print (
"</td>");
  }
 print (
"</table>"); 
jetzt habe ich alle, die zutreffen - wie werfe ich jetzt alle anderen als ergebnis aus, abzüglich den objekten, die zutreffen?


wäre super dankbar für eure hilfe

liebe grüße

protogue
Mit Zitat antworten
freelancermap.de - IT Projektvermittlung für Selbständige und Freiberufler
  #2 (permalink)  
Alt 21-02-2005, 15:19
cst
 Registrierter Benutzer
Links : Onlinestatus : cst ist offline
Registriert seit: Aug 2003
Beiträge: 141
cst ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Du musst die Abfrage auf die Objekt-Tabelle und die Buchstabelle beziehen. Du willst doch alle Objekte haben, die nicht für einen bestimmten Zeitraum nicht in der Buchungstabelle enthalten sind, oder?! Ich kenne deine Objekte-Tabelle nicht, daher hab ich einfach irgendwas angenommen.

Code:
SELECT
  objekte.objekt_id
FROM
  objekte,
  buchung
WHERE
  objekte.objekt_id = buchung.objekt_id
 AND 
  buchung.datum NOT (BETWEEN '$start' AND '$ende')
Das wär´s eigentlich.

PS: Wer einen Fehler findet, darf ihn gerne behalten.
__________________
Ich denke, also bin ich.
Manche sind trotzdem!
Mit Zitat antworten
  #3 (permalink)  
Alt 22-02-2005, 01:46
protogue
 Newbie
Links : Onlinestatus : protogue ist offline
Registriert seit: Oct 2004
Beiträge: 9
protogue ist zur Zeit noch ein unbeschriebenes Blatt
Standard noch ein denkfehler

hallo cst,
danke für die schnelle antwort,
aber deine abfrage funktioniert so auch nicht!

das ergebnis wirft mir ja immer noch alle anderen daten des gleichen objektes aus, die nicht im BETWEEN liegen.

also noch mal zur erklärung. das objekt 401 ist laut tabelle belegt am 1,2,3,8,9.

wenn ich jetzt im BETWEEN $start= '1' und $ende='3' habe, dann habe ich zwar treffer für das objekt 401 aber im ergebnis wird 401 trotzdem angezeigt, da ja die werte 8 und 9 auch gefunden wurden.

401 darf jetzt aber nicht auftauchen da treffer im zeitraum - wie kann ich das unterbinden?

bitte hilfe - ich verzweifele hier
Mit Zitat antworten
  #4 (permalink)  
Alt 22-02-2005, 07:58
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

Dann mach doch zwei Abfragen

Zuerst die IDs der nicht verfügbaren Objekte ermitteln
Dann die Objekte ermitteln, deren IDs NOT IN (kommeseparierte IDs der nicht verfügbaren IDs)
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
Mit Zitat antworten
  #5 (permalink)  
Alt 22-02-2005, 08:20
cst
 Registrierter Benutzer
Links : Onlinestatus : cst ist offline
Registriert seit: Aug 2003
Beiträge: 141
cst ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ach so....
ich denke ich hab´s jetzt begriffen. Naja, da kommst du mit SQL nicht wirklich weiter (glaube ich).

Ok, ich würde die Informationen in einer (HTML-)Tabelle am Bildschirm darstellen (wenn der Platz dazu ausreicht).

Code:
März____|_1_|_2_|_3_|_4_|_5_|_6_|_7_|_8_|_9_| ...
Objekt1 | B | B | B |   |   |   |   | B | B | ...
Objekt2 |   |   | B | B | B |   |   |   |   | ...  
Objekt3 |   | B |   |   | B |   |   | B |   | ...  
...

Dazu würde ich nun erstmal eine Liste aller Objekte Bilden.

PHP-Code:
mysql_connect("XXXXX","XXXX","XXXX") or die
  (
"Keine Verbindung moeglich");
    
mysql_select_db("XXXX") or die ("Die Datenbank existiert nicht");

$strSQL "SELECT
  objekt_id,
  objekt_name
FROM
  objekte"
;

$result=mysql_query($strSQL);

if (!
$result) { 
    echo 
"Could not successfully run query ($sql) from DB: " mysql_error(); 
    exit; 



while (
$arrRow mysql_fetch_row($result)) {
    
// irgendwas mit dem Ergebnis machen, falls nötig
    
$arrObjekte[] = $arrRow;

So nun schauen wir uns jedes der Objekte für einen bestimmten Zeitraum an. Ich gehe hier nur auf den Tag eines Monats ein,
wie in deinem Beispiel.


PHP-Code:

$start 
5;
$ende 8;

// Tabelle bauen
echo '<table><tr><td>Monatsname oder so...</td>';
for (
$intDay $start$intDay $ende$intDay++) {
    echo 
"<td>$intDay</td>";
}
echo 
'</tr>';    

foreach (
$arrObjekte AS $arrObjekt) {
    
$strSQL "SELECT * FROM buchung WHERE (datum BETWEEN '$start' AND '$ende') AND objekt_id = $arrObjekt['objekt_id'] GROUP BY datum ORDER BY datum";
    
$result mysql_query($strSQL);

    
$arrBelegung = array(); // Array löschen

    
while ($arrRow mysql_fetch_row($result)) {
        
$arrBelegung[$arrRow[datum]] = TRUE;
    }
    
    
// Ausgabe
    
echo "<tr><td>$arrObjekt['objekt_name']</td>";
    for (
$intDay $start$intDay $ende$intDay++) {
        echo 
'<td>';
        if (
$arrBelegung[$intDay]) {
            echo 
'B';
        } else {
           
// Zum Beispiel Link zur Buchung angeben....
        
}
        echo 
'</td>';
    }
    echo 
'</tr>';
}
    
echo 
'</table'>; 
Alles völlig ungetestet. Gibt bestimmt ein paar Syntax und Klammerprobleme. Ich hab´s halt so runtergeschrieben.
__________________
Ich denke, also bin ich.
Manche sind trotzdem!
Mit Zitat antworten
  #6 (permalink)  
Alt 22-02-2005, 14:26
protogue
 Newbie
Links : Onlinestatus : protogue ist offline
Registriert seit: Oct 2004
Beiträge: 9
protogue ist zur Zeit noch ein unbeschriebenes Blatt
Standard

danke cst - aber einen belegungsplan habe ich schon - die user sollen jetzt per formular freie termine suchen können, ohne jedes objekt anklicken zu müssen...

noch eine andere idee?
Mit Zitat antworten
  #7 (permalink)  
Alt 22-02-2005, 14:27
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

Zitat:
Original geschrieben von mrhappiness
Dann mach doch zwei Abfragen

Zuerst die IDs der nicht verfügbaren Objekte ermitteln
Dann die Objekte ermitteln, deren IDs NOT IN (kommeseparierte IDs der nicht verfügbaren IDs)
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
Mit Zitat antworten
  #8 (permalink)  
Alt 22-02-2005, 14:29
protogue
 Newbie
Links : Onlinestatus : protogue ist offline
Registriert seit: Oct 2004
Beiträge: 9
protogue ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hallo mrhappyness,

an deine lösung habe ich auch schon gedacht - aber wie bekomme ich die ids hier rein - zumal das beliebig vielle sein können?

(kommeseparierte IDs der nicht verfügbaren IDs)

sicher mit einen array[] - aber wie genau?
Mit Zitat antworten
  #9 (permalink)  
Alt 22-02-2005, 14:31
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard

Zitat:
Original geschrieben von protogue
mrhappyness


Zitat:
an deine lösung habe ich auch schon gedacht - aber wie bekomme ich die ids hier rein - zumal das beliebig vielle sein können?

(kommeseparierte IDs der nicht verfügbaren IDs)

sicher mit einen array[] - aber wie genau?
indem du die IDs mit mysql_fetch_assoc ausliest und in ein Array packst, das Array wandelst du mit implode in einen String um
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
Mit Zitat antworten
  #10 (permalink)  
Alt 22-02-2005, 17:19
protogue
 Newbie
Links : Onlinestatus : protogue ist offline
Registriert seit: Oct 2004
Beiträge: 9
protogue ist zur Zeit noch ein unbeschriebenes Blatt
Standard funzt

vielen dank mr. happyness,

es funktioniert endlich - dank deinem denkanstoß

hier nochmal meine abfragen:

PHP-Code:
$result mysql_query("SELECT objektid FROM buchen WHERE date BETWEEN '$start' AND '$ende' GROUP BY objektid");

while (
$row mysql_fetch_array($resultMYSQL_ASSOC)) {
$arrayid[]= $row["objektid"];
}
$comma_separated implode(","$arrayid);

$anfrage="SELECT * FROM objekt WHERE id NOT IN ($comma_separated)";

 
$ergebnis=mysql_query($anfrage);
 
$anz=mysql_num_rows($ergebnis); 
danke noch mal für eure hilfe
Mit Zitat antworten
  #11 (permalink)  
Alt 22-02-2005, 17:28
mrhappiness
 PHP Guru
Links : Onlinestatus : mrhappiness ist offline
Registriert seit: Oct 2002
Beiträge: 14.890
mrhappiness ist zur Zeit noch ein unbeschriebenes Blatt
mrhappiness eine Nachricht über AIM schicken mrhappiness eine Nachricht über Yahoo! schicken
Standard Re: funzt

Zitat:
Original geschrieben von protogue
vielen dank mr. happyness
Langsam glaube ich, du machst das absichtlich
__________________
Ich denke, also bin ich. - Einige sind trotzdem...
Mit Zitat antworten
  #12 (permalink)  
Alt 22-02-2005, 20:29
protogue
 Newbie
Links : Onlinestatus : protogue ist offline
Registriert seit: Oct 2004
Beiträge: 9
protogue ist zur Zeit noch ein unbeschriebenes Blatt
Standard ??

was soll ich absichtlich machen?
Mit Zitat antworten
  #13 (permalink)  
Alt 22-02-2005, 20:30
protogue
 Newbie
Links : Onlinestatus : protogue ist offline
Registriert seit: Oct 2004
Beiträge: 9
protogue ist zur Zeit noch ein unbeschriebenes Blatt
Standard sorry

du meinst deinen nick - sorry - sorry - ist mir entgangen
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

PHP Marktplatz-Software
PHP Marktplatz-SoftwareEs hat sich viel getan! Die neue Version 7.5.9 unserer PHP Marktplatz-Software ebiz-trader steht ab sofort zur Verfügung.

28.10.2019 | Berni

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni


 

Aktuelle PHP Scripte

ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script ansehen ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script

Mit unserer Lösungen können Sie nahezu jeden B2B / B2C Marktplatz betreiben den Sie sich vorstellen können. Ganz egal ob Sie einen Automarktplatz, Immobilenportal oder einfach einen Anzeigenmarkt betreiben möchten. Mit ebiz-trader können Sie Ihre Anforder

21.10.2020 Berni | Kategorie: PHP/ Anzeigenmarkt
Sendeplan Script inkl. Wunsch- und Grußbox + Kick-System + Bewerbungssystem

Das professionelle Sendeplan PHP Script inkl. Wunsch- und Grußbox + Kick-System für dein Webradio. Der übersichtliche Sendeplan bietet deinen Moderatoren und Zuhörern die perfekte Übersicht der aktuellen Shows! Du kannst nicht nur Sendungen eintragen, s

20.10.2020 drcomputer | Kategorie: PHP/ Web Radio
Newsmanager 2

Der Newsmanager 2 ist sehr Vielfältig und kann News schreiben, Newsletter versenden und RSS Feeds in einem erzeugen.

20.10.2020 Stephan_1972 | Kategorie: PHP/ News
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 14:23 Uhr.