Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

select distinct

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von adisresic, 23 Oktober 2014.

  1. adisresic

    adisresic Neuer Benutzer

    Also ich bastele schon seit 3 Jahren an einen Buchungsprogramm.

    Habe da eine Kalender Funktion gebastel wo man Zeitlinien der einzelnen Betten sehen kann.

    Also den Belegungsplan. Ich habe das Problem bei 2 verschachtelten While Schleifen.

    Die erste Selectiert mit:

    $resob=mysql_query("select distinct objektid
    from
    anzeigen
    WHERE
    gebucht='0' ");

    Nun zeight er mir immer nur einmal die Objektid als Vorkommen nur ein mal an.

    Das Problem in der Tabbele gibt es die Spalte bis als Datum und die brauche ich auch synchron zur Objektid
    zu veiterverarbeitung in der zweiten Schleife.

    Wie bekomm ich das hin.

    Danke im voraus für eure Hilfe!

    Noch dazu gesagt funktioniert der Kalender "Belegungsplan" auch.
    Nur ist das Problem bei dem aufbau der Horitontalen Kalenderansicht einer Monats, dass
    es unötige Daten der Vormonat wie auch der weiteren Monate in der Zukunft selectiert.

    Wenn dann einer 20 Zimmer hat und man das auf ein Jahr rechnet, selectiert er vieleicht 1000
    Datensätze unötig da Theoretisch der Kalender horitontal für ein Jahr aufgebaut wird = Serverabsturz:) Aber zu sehen ist nur ein Monat der 20 Zimmer!
     
    Zuletzt bearbeitet: 23 Oktober 2014
  2. Hony%

    Hony% Datenbank-Guru

    Entferne das DISTINCT aus deiner Abfrage. Dann erhältst du die gleiche objektid auch mehrfach.

    Allerdings habe ich den Eindruck, dass du hier eine Aufgabe der Datenbank in PHP lösen willst. Hilfreich wäre hier zusätzlich die zweite Abfrage und eine Beschreibung von dem Problem das du lösen willst.

    Gruß
    Hony

    Nachtrag:
    Ein Aufbau der Tabelle wäre auch sehr hilfreich. ;)
     
    Zuletzt bearbeitet: 23 Oktober 2014
  3. adisresic

    adisresic Neuer Benutzer

    Das Problem hab ich jetzt noch dazugeschrieben. Aber die Frage ist auch wie man das erklärt.

    Es soll nur das vorkommen einer Objekt id ermitteld werden doch brauche ich auch das bis Datum zu objektid.

    Aber wenn ich so nachdenke dann kann man die Spalte bis garnicht zuordnen. Wenn du gut bist vieleicht verstehst du es wenn du den gesamten Cod sichst.

    $order = 'ORDER BY reihenfolge ASC, zimmernummer ASC';

    $resob=mysql_query("select distinct objektid from anzeigen WHERE gebucht='0' and gebucht!='1' and gebucht!='2' and gebucht!='3' and register!='1' and archiv!='archiv' and zimmerart!='Kurzurlaub 5 Tage' and zimmerart!='Kurzurlaub 4 Tage' and zimmerart!='Kurzurlaub-5' and zimmerart!='Kurzurlaub-4' and owner='$IDUser' $order");


    $anzalanzeigen = mysql_num_rows($resob);

    if($anzalanzeigen == 0)
    {
    echo $anzalanzeigen;die;
    }


    echo '<div id="schlissen"><a href="javascript:wegtabelle()">[X]</a></div>';
    echo '<div id="containertabelle">';


    while($resultatob=mysql_fetch_assoc($resob))
    {
    $objektid = $resultatob['objektid'];
    $farbatagenichtfrei = '';
    $texte = '';
    $bisrech = $resultatob['bis'];

    echo $bisrech;

    $res=mysql_query("SELECT ident,von,bis,zimmernummer,farbe,land,bundesland,objektstrasse,zimmerart,objektpostl FROM anzeigen WHERE objektid='$objektid' and gebucht='0' and gebucht!='1' and gebucht!='2' and gebucht!='3' and register!='1' and archiv!='archiv' and zimmerart!='Kurzurlaub 5 Tage' and zimmerart!='Kurzurlaub 4 Tage' and zimmerart!='Kurzurlaub-5' and zimmerart!='Kurzurlaub-4' and von>= '$vonrech' and owner='$IDUser' $order");

    $ar = mysql_num_rows($res);

    echo $ar;


    $wochentagarray = array();
    $dateinanzeigebis = array();
    $dateinanzeige = array();
    $tagem = array();

    $buchung =0;


    while($resultat2=mysql_fetch_assoc($res))
    {
    $ident = $resultat2['ident'];
    $zimmernummer = $resultat2['zimmernummer'];
    $land = $resultat2['land'];
    $bundesland = $resultat2['bundesland'];
    $objektstrasse = $resultat2['objektstrasse'];
    $objektpostl = $resultat2['objektpostl'];
    $zimmerart = $resultat2['zimmerart'];





    if('Ferienwohnung' == $zimmerart)
    {
    $farbatagenichtfrei = '#'.$resultat2['farbe'];
    $texte = $objektstrasse.'<br>'.$objektpostl.'<br>'.$zimmerart;
    }
    else
    {
    $texte = $zimmernummer.' '.$zimmerart;
    $farbatagenichtfrei = '#FF8B00';
    }

    $res3=mysql_query("select bild from bilder where owner='$IDUser' and ident='$ident' limit 1");
    $bildident = mysql_fetch_assoc($res3);
    $bildid = $bildident['bild'];

    if($zimmerart != 'Einzelzimmer' and $zimmerart != 'Doppelzimmer' and $zimmerart != 'Apartment' and $zimmerart != 'Behindertengerecht' and $zimmerart != 'Doppelzimmer Superior' and $zimmerart != 'Kurzurlaub 4 Tage' and $zimmerart != 'Kurzurlaub 5 Tage' and $zimmerart != 'Ferienwohnung')
    $multi_Eingabe = 'Bucheneingabe_eigenes_produkt_insite_Tabelle';

    if($zimmerart == 'Einzelzimmer' or $zimmerart == 'Doppelzimmer' or $zimmerart == 'Apartment' or $zimmerart == 'Behindertengerecht' or $zimmerart == 'Doppelzimmer Superior')
    $multi_Eingabe = 'Bucheneingabe_Standard_zimmer_insite_tabelle';

    if($zimmerart == 'Ferienwohnung')
    $multi_Eingabe = 'Bucheneingabe_Tabelle_ferienwohnung_inste_tabelle';


    $vonb = $resultat2['von'];
    $bisb = $resultat2['bis'];

    $von1 = $resultat2['von'];
    $bis1 = $resultat2['bis'];


    $tag2 = substr($bis1,-2);
    $monat2 = substr($bis1, -5,2);
    $jahr2 = substr($bis1,0,-6);

    $tag1 = substr($von1,-2);
    $monat1 = substr($von1,-5,2);
    $jahr1 = substr($von1,0,-6);

    $von1 = $tag1.'-'.$monat1.'-'.$jahr1;
    $bis1 = $tag2.'-'.$monat2.'-'.$jahr2;




    for($i=1;$i<=$tage;$i++)
    {
    $datum= mktime(0, 0, 0,$m,$i,$Y);


    $wochentag = date("D", $datum);
    $wochentagarray[$i]=$wochentag;





    $von=strtotime($von1);
    $bis=strtotime($bis1);

    $filename = "../../../bilder/".$bildid;
    @list($width, $height) = getimagesize($filename);

    if($bildid == '')
    {
    $filename = "../../../bilder/kein-bild.jpg";
    @list($width, $height) = getimagesize($filename);
    $bildid = "kein-bild.jpg";
    }





    if($datum < $von or $datum > $bis)
    {
    $tagem[$buchung][$i]=0;
    $dateinanzeigevon[$buchung][$i]=$von1;
    $dateinanzeigebis[$buchung][$i]=$bis1;

    $dateinanzeigevon1[$buchung][$i]=$vonb;
    $dateinanzeigebis2[$buchung][$i]=$bisb;
    $identio[$buchung][$i]=$ident;
    }

    else
    {
    $tagem[$buchung][$i]=1;
    $dateinanzeigevon[$buchung][$i]=$von1;
    $dateinanzeigebis[$buchung][$i]=$bis1;

    $dateinanzeigevona[$buchung][$i]=$vonb;
    $dateinanzeigebisb[$buchung][$i]=$bisb;
    $identio[$buchung][$i]=$ident;

    }
    }





    $buchung = $buchung+1;
    }


    $tagem2 = array();



    echo '<center><table cellpadding="0" style="width: auto;">';

    for($i2=0;$i2<$buchung;$i2++)
    {
    for($i=0;$i<=$tage;$i++)
    {
    if($tagem[$i2][$i]==1)
    {
    $tagem2[$i]=1;
    }

    }
    }


    for($i2=0;$i2<$buchung;$i2++)
    {
    for($i=0;$i<=$tage;$i++)
    {
    if($tagem[$i2][$i]==1)
    {
    $tagem2[$i]=1;
    $datepoint1[$i] = $dateinanzeigevon[$i2][$i];
    $datepoint2[$i] = $dateinanzeigebis[$i2][$i];

    $identar[$i] = $identio[$i2][$i];
    $datepoint1a[$i] = $dateinanzeigevona[$i2][$i];
    $datepoint2b[$i] = $dateinanzeigebisb[$i2][$i];
    }
    echo $datepoint[$i];
    }
    }



    for($iz = 1 ; $iz <= $tage ; $iz++)
    echo '<td style="border: 1px solid #000000;width: '.$qudratgrosse.';height: '.$qudratgrosse.';background-color:'.$farbetage.';text-align: center;"><div style="width: '.$qudratgrosse.'; height: '.$qudratgrosse.';background-color: '.$farbetage.';padding: '.$padding.';"><font size="'.$fontsize.'" color="'.$fontcollor.'">'.$wochentagarray[$iz].'</font></div></td>';


    echo'<tr></tr>';




    for($i=1;$i<=$tage;$i++)
    {

    $datum = mktime(0, 0, 0,$m,$i,$Y);

    $datumausgabe = date("d-m-Y", $datum);
    $zeit = time();

    $datumausgabe2 = date("d-m-Y", $zeit);




    if($tagem2[$i]==1)
    {
    $keinlink = ' href="javascript:buchenanzeigen(\''.$IDUser.'\',\''.$identar[$i].'\',\''.$datepoint1[$i].'\',\''.$datepoint2[$i].'\',\''.$objektid.'\',\''.$multi_Eingabe.'\',\''.$num.'\',\''.$m.'\',\''.$Y.'\')"';
    if($datumausgabe2 == $datumausgabe)
    {
    echo '<td style="border: 1px solid #000000;width: '.$qudratgrosse.';height: '.$qudratgrosse.';text-align: center;background-color:'.$farbaktuellertag.'"><div style="width: '.$qudratgrosse.';height: '.$qudratgrosse.';padding: '.$padding.';background-color:'.$farbaktuellertag.';" onmouseover="Lade_bild(\''.$bildid.'\',\'Schloss_Granitz\',\'von '.$datepoint1[$i].' bis '.$datepoint2[$i].'\');" onmouseout="Bild_Weg()"><a '.$keinlink.'><font size="'.$fontsize.'" color="'.$fontcollor.'">'.$i.'</font></a></div></td>';
    }
    else
    {
    echo '<td style="border: 1px solid #000000;width: '.$qudratgrosse.';height: '.$qudratgrosse.';background-color:'.$farbatagefrei.';text-align: center;"><div style="width: '.$qudratgrosse.';height: '.$qudratgrosse.';background-color:'.$farbatagefrei.';padding: '.$padding.';" onmouseover="Lade_bild(\''.$bildid.'\',\'Schloss_Granitz\',\'von '.$datepoint1[$i].' bis '.$datepoint2[$i].'\');" onmouseout="Bild_Weg()"><a '.$keinlink.'><font size="'.$fontsize.'" color="'.$fontcollor.'">'.$i.'</font></a></div></td>';
    }
    }

    else
    {
    if($datumausgabe2 == $datumausgabe)
    {
    echo '<td style="border: 1px solid #000000;width: '.$qudratgrosse.';height: '.$qudratgrosse.';text-align: center;background-color:'.$farbaktuellertag.';"><div style="width: '.$qudratgrosse.';height: '.$qudratgrosse.';padding: '.$padding.';background-color:'.$farbaktuellertag.';"><font size="'.$fontsize.'" color="'.$fontcollor.'"><a '.$keinlink.'>'.$i.'</a></font></div></td>';
    }
    else
    {
    $keinlink = '';
    echo '<td style="border: 1px solid #000000;width: '.$qudratgrosse.';height: '.$qudratgrosse.';text-align: center;background-color:'.$farbatagenichtfrei.';"><div style="width: '.$qudratgrosse.';height: '.$qudratgrosse.';background-color:'.$farbatagenichtfrei.';padding: '.$padding.';" ><a '.$keinlink.'><font size="'.$fontsize.'" color="'.$fontcollor.'"><a '.$keinlink.'>'.$i.'</a></font></a></div></td>';
    }
    }
    }


    echo '<td style="border: 1px solid #000000;width: '.$qudratgrosse.';height: '.$qudratgrosse.';text-align: center;background-color:#00C600;padding:3px;width:250px;">'.$texte.' </td><td style="border: 1px solid #000000;width: '.$qudratgrosse.';height: '.$qudratgrosse.';text-align: center;background-color:#BEBEC0;padding: 5px;"><a href="javascript:tabellezuruck(\''.$m.'\',\''.$Y.'\')" style="color: #000000;padding: 5px;"><<<<</a></td><td style="border: 1px solid #000000;width: '.$qudratgrosse.';height: '.$qudratgrosse.';text-align: center;background-color:#FF8800;padding: 5px;"> '.$m.' '.$Y.' </td><td style="border: 1px solid #000000;width: '.$qudratgrosse.';height: '.$qudratgrosse.';text-align: center;background-color:#BEBEC0;padding: 5px;"><a href="javascript:tabelleweiter(\''.$m.'\',\''.$Y.'\')" style="color: #000000;">>>>></a></td></table>';


    echo '<hr style="color: red; background: blue; height: 15px;" />';
    }
     
  4. adisresic

    adisresic Neuer Benutzer

    Ah ja ich glaub das Problem zu verkennen. Die Tabelle besteht aus 49 Spalten und relevant sind nur spalten von bis objektid.

    Damit rendere ich die Tabelle.


     
  5. adisresic

    adisresic Neuer Benutzer

    [​IMG]

    So sieht der kalender aus nur das man es sich vorstellen kann!

    Ich denke mein gröstes Problem ist was man einen MYSQL Server denn so zumuten kan.
     
    Zuletzt bearbeitet: 23 Oktober 2014
  6. Hony%

    Hony% Datenbank-Guru

    Was ich dir jetzt schreibe soll weder arrogant noch entmutigend sein. Erstens fallen Meister nach wie vor nicht vom Himmel und zweitens ist Programmieren für dich wohl eher ein Hobby als dein täglich Brot. Ich denke aber, dass wir mit der deutlichen Worten schneller zu einer Lösung kommen.

    Ich hab mir sowohl den Code als auch die Querys kurz angesehen. Und leider ist das alles ziemlich hässlich. Ich fürchte ich kann dir nur dann eine halbwegs befriedigende Antwort geben wenn du mir den Tabellenaufbau sowie möglichst einige Beispieldaten zugänglich machst. Das müssen natürlich keine echten Daten sein! Künstliche Daten oder anonymisierte reichen völlig. Auch reichen so circa 10-20 Datensätze.

    Hilfreich ist hier SHOW COLUMNS.

    Dann können wir gerne Schritt für Schritt eine sinnvolle und tragfähige Lösung suchen.

    Das ist ein recht deutlicher Hinweis auf ein schlechtes Datenbankdesign.

    MySQL kann man im Grunde eine Menge zumuten. Ich glaube ehrlich gesagt auch, dass in diesem Fall nicht MySQL sonder PHP der Flaschenhals ist obwohl du den Datenbankserver schon ziemlich belastest.

    1000 Datensätze sind für ein Datenbanksystem eigentlich ein Witz. Das könnte sogar ein Smartphone leisten. In deinem Fall können daraus aber 1001 Abfragen werden. Das kann selbst potente Server in die Knie zwingen.
     
  7. ukulele

    ukulele Datenbank-Guru

    Ich würde sagen deinem Eingangscode
    Code:
    select distinct objektid
    from
    anzeigen
    WHERE
    gebucht='0'
    kann doch einfach mit AND datum_bis <= letzter Tag des Zeitraums den du selektieren willst erweitert werden. Sinnvoll wäre Start und Ende zu berechnen und nur diese Daten dann auch wirklich von der Datenbank abzufragen.

    Ansonsten stimme ich Hony% zu, dein Code :confused: Nutze SQL richtig und bau nicht 1000 Schleifen.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden