Ankündigung

Einklappen
Keine Ankündigung bisher.

Abfrage problem

Einklappen

Neue Werbung 2019

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

  • Abfrage problem

    Hallo Gemeinschaft,

    ich habe eine Buchungstabelle, die so aussieht
    es gibt 4 Haustypen

    id_haustyp_belegtvon_belegtbis
    1_1______01.01.2016_08.01.2016
    2_1______03.02.2016_06.03.2016
    3_3______01.01.2016_06.01.2016

    nun habe ich eine suchmaske
    von(Datum) - bis (Datum)

    wenn ich nun z.b. vom 01.01.2016 bis 06.01.2016 in die beiden textfelder der suchmaske eingebe, dann möchte ich eine liste von haustypen angezeigt bekommen, die auch wirklich frei sind

    könnt ihr mir dabei helfen


  • #2
    Zeige mal einen SQL Dump deiner Tabelle mit einigen Testdaten.

    Kommentar


    • #3
      Code:
      -- phpMyAdmin SQL Dump
      -- version 4.5.1
      -- http://www.phpmyadmin.net
      --
      -- Host: 127.0.0.1
      -- Erstellungszeit: 26. Okt 2017 um 14:55
      -- Server-Version: 10.1.13-MariaDB
      -- PHP-Version: 5.5.37
      
      SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
      SET time_zone = "+00:00";
      
      
      /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
      /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
      /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
      /*!40101 SET NAMES utf8mb4 */;
      
      --
      -- Datenbank: `beleg`
      --
      
      -- --------------------------------------------------------
      
      --
      -- Tabellenstruktur für Tabelle `buchung`
      --
      
      CREATE TABLE `buchung` (
      `id` int(2) NOT NULL,
      `typ` int(2) NOT NULL,
      `von` date NOT NULL,
      `bis` date NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
      --
      -- Daten für Tabelle `buchung`
      --
      
      INSERT INTO `buchung` (`id`, `typ`, `von`, `bis`) VALUES
      (1, 1, '2017-10-01', '2017-10-07'),
      (2, 1, '2017-10-16', '2017-10-24'),
      (3, 2, '2017-10-01', '2017-10-20'),
      (4, 3, '2017-10-10', '2017-10-24');
      
      --
      -- Indizes der exportierten Tabellen
      --
      
      --
      -- Indizes für die Tabelle `buchung`
      --
      ALTER TABLE `buchung`
      ADD PRIMARY KEY (`id`);
      
      --
      -- AUTO_INCREMENT für exportierte Tabellen
      --
      
      --
      -- AUTO_INCREMENT für Tabelle `buchung`
      --
      ALTER TABLE `buchung`
      MODIFY `id` int(2) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
      /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
      /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
      /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

      Kommentar


      • #4
        Code:
        SELECT DISTINCT `typ`
        FROM `buchung`
        WHERE (
        '2017-10-08' NOT
        BETWEEN `von`
        AND `bis`
        )
        AND (
        '2017-10-09' NOT
        BETWEEN `von`
        AND `bis`
        )
        Spukt alle Häuser aus die im Zeitraum 8.-9.10.2017 frei sind, hier also 1 und 3.

        Kommentar


        • #5
          .... aber so zeigt er mir alle an, die belegt sind - die ausgabe enthält nun alle datensätze aus der db tab

          hab die felder umbenannt

          PHP-Code:
          $db_link mysqli_connect (
                               
          MYSQL_HOST,
                               
          MYSQL_BENUTZER,
                               
          MYSQL_KENNWORT,
                               
          MYSQL_DATENBANK
                              
          );

          $sql =  "SELECT DISTINCT id, type FROM `reservierungen` WHERE ('2017-10-08' NOT BETWEEN `from`
          AND `until` ) AND ('2017-10-09' NOT BETWEEN `from` AND `until` )"
          ;

          $db_erg mysqli_query$db_link$sql );
          if ( ! 
          $db_erg )
          {
            die(
          'Ungültige Abfrage: ' mysqli_error());
          }

          echo 
          '<table border="1">';
          while (
          $zeile mysqli_fetch_array$db_ergMYSQL_ASSOC))
          {
            echo 
          "<tr>";
            echo 
          "<td>"$zeile['id'] . "</td>";
            echo 
          "<td>"$zeile['type'] . "</td>";
          //  echo "<td>". $zeile['from'] . "</td>";
          //  echo "<td>". $zeile['until'] . "</td>";
            
          echo "</tr>";
          }
          echo 
          "</table>";

          mysqli_free_result$db_erg );


          ?> 
          ... muss das nicht irgendwie anders gehen? - weil, ... ich habe doch 4 haustypen - und in der tabelle stehen doch nur die, die nicht frei sind

          Kommentar


          • #6
            Warum haust du die id da nun wieder rein.
            Code:
            SELECT DISTINCT id,...
            Ich habe die id mit Absicht weggelassen.

            Deine Aussage war doch
            dann möchte ich eine liste von haustypen angezeigt bekommen, die auch wirklich frei sind
            und genau das macht meine Abfrage, sie zeigt nur die freien Haustypen an.

            Kommentar


            • #7
              nee -klappt nicht - woher soll er denn die haustypen kennen, die frei sind

              zeigt nach wie vor alle an

              PHP-Code:
              $v1 =2017-10-01;
              $b1 =2017-10-07;


              $db_link mysqli_connect (
                                   
              MYSQL_HOST,
                                   
              MYSQL_BENUTZER,
                                   
              MYSQL_KENNWORT,
                                   
              MYSQL_DATENBANK
                                  
              );

              $sql =  "SELECT DISTINCT  type FROM `reservierungen` WHERE ($v1 NOT BETWEEN `from`
              AND `until` ) AND (
              $b1 NOT BETWEEN `from` AND `until` )";

              $db_erg mysqli_query$db_link$sql );
              if ( ! 
              $db_erg )
              {
                die(
              'Ungültige Abfrage: ' mysqli_error());
              }

              echo 
              '<table border="1">';
              while (
              $zeile mysqli_fetch_array$db_ergMYSQL_ASSOC))
              {
                echo 
              "<tr>";
                echo 
              "<td>"$zeile['id'] . "</td>";
                echo 
              "<td>"$zeile['type'] . "</td>";
              //  echo "<td>". $zeile['from'] . "</td>";
              //  echo "<td>". $zeile['until'] . "</td>";
                
              echo "</tr>";
              }
              echo 
              "</table>";

              mysqli_free_result$db_erg ); 

              Kommentar


              • #8
                Ich habe dir mal ein SQL Fiddle gebaut. Typ ist das Haus und da zeigt er dann 1 und 3 weil wir ja wissen wollen was in dem Zeitraum frei ist.
                klickst du hier

                Kommentar


                • #9
                  Hallo-lieben Dank für den Hinweis – aber wenn ich vom 6. September bis zum Beispiel 24. Oktober dann passt das leider nicht

                  Kommentar


                  • #10
                    ...wenn ich z.b. das in die fiddle einsetze

                    PHP-Code:
                    SELECT DISTINCT `typ`
                    FROM `buchung23`
                    WHERE (
                    '2017-09-08' NOT
                    BETWEEN 
                    `von`
                    AND `
                    bis`
                    )
                    AND (
                    '2017-11-09' NOT
                    BETWEEN 
                    `von`
                    AND `
                    bis`

                    werden alle haustypen angezeigt - obwohl die nicht den ganzen zeitraum bebuchbar sind

                    Kommentar


                    • #11
                      Zitat von jensg Beitrag anzeigen

                      ... muss das nicht irgendwie anders gehen? - weil, ... ich habe doch 4 haustypen - und in der tabelle stehen doch nur die, die nicht frei sind
                      woher soll die DB das wissen, daß es da 4 oder 87 Haustypen gibt? Dazu brauchst Du eine weitere Tabelle, die alle Deine Haustypen kennt. Von der ziehst Du die belegten ab, übrig bleiben die freien. Deine Vergleiche mit den Datumswerten gehen vermutlich in die Hose, weil Du eben nicht nur auf Start- und Enddatum prüfen willst, sondern auf den Bereich. Mit PostgreSQL könntest Du das extrem elegant mit RANGE-Typen lösen, die wurden exakt für solche Dinge erfunden.

                      Code:
                      test=# create table buchung (id int primary key, typ int, belegt daterange);
                      CREATE TABLE
                      test=# insert into buchung values (1,1,'[2016-01-01, 2016-01-08)');
                      INSERT 0 1
                      test=# insert into buchung values (2,1,'[2016-02-03, 2016-03-06)');
                      INSERT 0 1
                      test=# insert into buchung values (3,3,'[2016-01-01, 2016-01-06)');
                      INSERT 0 1
                      
                      test=# select * from buchung ;
                       id | typ |         belegt          
                      ----+-----+-------------------------
                        1 |   1 | [2016-01-01,2016-01-08)
                        2 |   1 | [2016-02-03,2016-03-06)
                        3 |   3 | [2016-01-01,2016-01-06)
                      (3 rows)
                      
                      test=# select distinct (typ) from buchung where not belegt  && '[2016-01-01,2016-01-06]'::daterange;
                       typ
                      -----
                         1
                      (1 row)
                      Der && - Operator prüft, ob sich 2 Ranges überlappen, davor steht ein NOT, ich prüfen also alle Datensätzen, deren belegt-Feld nicht mit dem gegebenen Zeitraum überlappt.
                      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                      Kommentar


                      • #12
                        um den anderen Teil noch zu zeigen:

                        Code:
                        test=# create table haustypen as select s as id, 'typ ' || s::text as name from generate_series(1,10) s(s);
                        SELECT 10
                        test=# select * from haustypen ;
                         id |  name  
                        ----+--------
                          1 | typ 1
                          2 | typ 2
                          3 | typ 3
                          4 | typ 4
                          5 | typ 5
                          6 | typ 6
                          7 | typ 7
                          8 | typ 8
                          9 | typ 9
                         10 | typ 10
                        (10 rows)
                        
                        test=# select * from haustypen where id not in (select distinct (typ) from buchung where not belegt  && '[2016-01-01,2016-01-06]'::daterange);
                         id |  name  
                        ----+--------
                          2 | typ 2
                          3 | typ 3
                          4 | typ 4
                          5 | typ 5
                          6 | typ 6
                          7 | typ 7
                          8 | typ 8
                          9 | typ 9
                         10 | typ 10
                        (9 rows)
                        
                        test=#
                        PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                        Kommentar


                        • #13
                          hi - lieben dank für deine info - hatte mir es auch schon gedacht, dass es so nicht funktionieren kann - habe nur noch ne frage zu deinem vorschalg - ich benöigte nun also noch eine zweite tabelle mit nur den haustypen? oder was soll da noch drin stehen

                          es sollte schon bei mysql bleiben

                          diese tab habe ich im moment
                          PHP-Code:
                          CREATE TABLE IF NOT EXISTS `buchung23` (
                            `
                          idint(2NOT NULL,
                            `
                          typint(2NOT NULL,
                            `
                          vondate NOT NULL,
                            `
                          bisdate NOT NULL,
                            
                          PRIMARY KEY (`id`)
                          ENGINE=InnoDB DEFAULT CHARSET=utf8;

                          INSERT INTO `buchung23` (`id`, `typ`, `von`, `bis`) VALUES
                          (11'2017-10-01''2017-10-07'),
                          (
                          21'2017-10-16''2017-10-24'),
                          (
                          32'2017-10-01''2017-10-20'),
                          (
                          43'2017-10-10''2017-10-24'),
                          (
                          54'2018-10-10''2018-10-24'),
                          (
                          63'2011-10-10''2011-10-24'); 

                          Kommentar


                          • #14
                            Zitat von jensg Beitrag anzeigen
                            hi - lieben dank für deine info - hatte mir es auch schon gedacht, dass es so nicht funktionieren kann - habe nur noch ne frage zu deinem vorschalg - ich benöigte nun also noch eine zweite tabelle mit nur den haustypen? oder was soll da noch drin stehen
                            Nun - alles, was Du an Stammdaten da brauchst. Raucher oder Nichtraucher, Baujahr, geplanter Abriss, whatever.
                            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                            Kommentar


                            • #15
                              - wie würdest du es denn machen ohne postgre

                              Kommentar

                              Lädt...
                              X