Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit Mysql Left Join Ambfrage

Einklappen

Neue Werbung 2019

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

  • Problem mit Mysql Left Join Ambfrage

    Hallo Leute ich hoffe ihr könnt mir weiterhelfen seit 2 Tagen komm i an dem Problem net vorbei!

    Also ich habe 2 Tabellen
    Tabelle A Hotelsaisonen:
    Code:
    INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(24, '453810', '2010-07-10', '2010-07-23');
    INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(23, '453810', '2010-04-30', '2010-07-09');
    INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(26, '453810', '2010-07-24', '2010-08-20');
    INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(27, '453810', '2010-08-21', '2010-09-10');
    INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(28, '453810', '2010-09-11', '2010-10-28');
    INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(29, '453810', '2010-12-03', '2010-12-10');
    Und Tabelle B Hotelseisonen_preise:
    Code:
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(200, '453810', 0.00, 45.00, 0.00, 0.00, 0.00, 'DZ', 24);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(199, '453810', 0.00, 34.00, 0.00, 0.00, 0.00, 'DZ', 23);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(198, '453810', 0.00, 33.00, 0.00, 0.00, 0.00, 'MZ', 28);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(197, '453810', 0.00, 48.00, 0.00, 0.00, 0.00, 'MZ', 27);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(196, '453810', 0.00, 58.00, 0.00, 0.00, 0.00, 'MZ', 26);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(195, '453810', 0.00, 45.00, 0.00, 0.00, 0.00, 'MZ', 24);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(194, '453810', 0.00, 34.00, 0.00, 0.00, 0.00, 'MZ', 23);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(193, '453810', 0.00, 42.00, 0.00, 0.00, 0.00, 'SUP', 28);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(192, '453810', 0.00, 58.00, 0.00, 0.00, 0.00, 'SUP', 27);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(191, '453810', 0.00, 68.00, 0.00, 0.00, 0.00, 'SUP', 26);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(190, '453810', 0.00, 55.00, 0.00, 0.00, 0.00, 'SUP', 24);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(189, '453810', 0.00, 42.00, 0.00, 0.00, 0.00, 'SUP', 23);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(201, '453810', 0.00, 58.00, 0.00, 0.00, 0.00, 'DZ', 26);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(202, '453810', 0.00, 48.00, 0.00, 0.00, 0.00, 'DZ', 27);
    INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(203, '453810', 0.00, 34.00, 0.00, 0.00, 0.00, 'DZ', 28);
    Habe folgende Select Anweisdung:
    PHP-Code:
    $select "
              SELECT 
              * 
              FROM 
              hotelsaisonen AS a 
              LEFT JOIN 
              hotelsaisonen_preise AS b ON a.ID = b.Saison_id 
              WHERE 
              b.Saison_id IS NULL
              UNION
                SELECT 
                * 
                FROM 
                hotelsaisonen AS a 
                LEFT JOIN 
                hotelsaisonen_preise AS b ON a.ID = b.Saison_id 
                WHERE b.Kategorie_id = '"
    .$category."'
                UNION
                  SELECT 
                * 
                FROM 
                  hotelsaisonen AS a 
                  LEFT JOIN 
                  hotelsaisonen_preise AS b ON b.kategorie_id = '"
    .$category."' 
                WHERE b.Saison_id IS NULL
            ORDER BY SaisonStart ASC"

    Die Sql anweisung soll mir alle saisonen ausgeben die deffiniert wurden und auch die die nicht deffiniert wurden was sie auch macht! nur wenn ich eine saison hinzufüge und den preis für eine bestimmte kategorie deffiniere wird mir die neu hinzugefügte saison bei den anderen kategorien nicht mehr angezeigt.

    worann kann das liegen?

    Code:
    SELECT 
                * , a.ID AS Saisons_id
                FROM 
          		hotelsaisonen AS a 
          		LEFT JOIN 
          		hotelsaisonen_preise AS b ON b.kategorie_id = '".$category."' 
    			WHERE b.Saison_id IS NULL
    Soll mir die saisonen ausgeben wenn nach einer noch nicht deffinierten saison gesucht wird


  • #2
    Ich habe Deine Testdaten in folgende Tabellen eingelesen:

    Code:
    CREATE TABLE hotelsaisonen (
     id int not null,
     hotelcode INT not null,
     saisonstart DATE NOT NULL,
     saisonend DATE NOT NULL
    );
    
    CREATE TABLE hotelsaisonen_preise (
     id int not null,
     hotelcode INT not null,
     ov DEC(10,2) NOT NULL,
     bb DEC(10,2) NOT NULL, 
     hp DEC(10,2) NOT NULL, 
     vp DEC(10,2) NOT NULL, 
     ai DEC(10,2) NOT NULL, 
     kategorie_id VARCHAR(5),
     saison_id INT NOT NULL
    );
    Wenn ich den folgenden Query ausführe, erhalte ich "6 Rows" als Ergebnis. Könntest Du dafür das von Dir gewünschte Ergebnis zeigen. Dann kann ich nachvollziehen, wohin die Frage zieht.

    Code:
    SELECT * 
      FROM hotelsaisonen AS a 
      LEFT JOIN hotelsaisonen_preise AS b 
        ON a.id = b.saison_id 
     WHERE  b.saison_id IS NULL 
     
    UNION 
    
    SELECT * 
      FROM   hotelsaisonen AS a 
      LEFT JOIN hotelsaisonen_preise AS b 
        ON a.id = b.saison_id 
     WHERE  b.kategorie_id = 'DZ' 
     
    UNION 
    
    SELECT * 
      FROM  hotelsaisonen AS a 
      LEFT JOIN hotelsaisonen_preise AS b 
        ON b.kategorie_id = 'DZ' 
     WHERE  b.saison_id IS NULL 
     
    ORDER  BY saisonstart ASC; 
    
    ...
    mysql>6 rows in set (0.00 sec)
    Grüße
    Thomas

    Kommentar


    • #3
      Ergänzung:

      Dieser Teil im SQL ist jedenfall nicht korrekt, was den "LEFT JOIN" angeht.


      Code:
      ..
      SELECT * 
        FROM  hotelsaisonen AS a 
        LEFT JOIN hotelsaisonen_preise AS b 
       ON b.kategorie_id = 'DZ'  
      WHERE  b.saison_id IS NULL 
      ..
      Mit "ON ..." sollten die beiden Tabellen verbunden werden, dass fehlt derzeit.

      Grüße
      Thomas

      Kommentar


      • #4
        Hallo vielen dank für die schnella Antwort.
        der Fehler tritt auf wenn der sql string so aussieht:
        Tabelle A:
        Code:
        CREATE TABLE IF NOT EXISTS `hotelsaisonen` (
          `ID` int(11) NOT NULL auto_increment,
          `HotelCode` varchar(30) NOT NULL,
          `SaisonStart` date NOT NULL,
          `SaisonEnd` date NOT NULL,
          PRIMARY KEY  (`ID`)
        ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=30 ;
        
        --
        -- Dump dei dati per la tabella `hotelsaisonen`
        --
        
        INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(24, '453810', '2010-07-10', '2010-07-23');
        INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(23, '453810', '2010-04-30', '2010-07-09');
        INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(26, '453810', '2010-07-24', '2010-08-20');
        INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(27, '453810', '2010-08-21', '2010-09-10');
        INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(28, '453810', '2010-09-11', '2010-10-28');
        INSERT INTO `hotelsaisonen` (`ID`, `HotelCode`, `SaisonStart`, `SaisonEnd`) VALUES(29, '453810', '2010-12-03', '2010-12-10');
        Tabelle B:
        Code:
        CREATE TABLE IF NOT EXISTS `hotelsaisonen_preise` (
          `ID` int(11) NOT NULL auto_increment,
          `HotelCode` varchar(30) NOT NULL,
          `OV` float(10,2) NOT NULL,
          `BB` float(10,2) NOT NULL,
          `HP` float(10,2) NOT NULL,
          `VP` float(10,2) NOT NULL,
          `AI` float(10,2) NOT NULL,
          `Kategorie_id` varchar(5) NOT NULL,
          `Saison_ID` float NOT NULL,
          PRIMARY KEY  (`ID`)
        ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=209 ;
        
        --
        -- Dump dei dati per la tabella `hotelsaisonen_preise`
        --
        
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(200, '453810', 0.00, 45.00, 0.00, 0.00, 0.00, 'DZ', 24);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(199, '453810', 0.00, 34.00, 0.00, 0.00, 0.00, 'DZ', 23);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(198, '453810', 0.00, 33.00, 0.00, 0.00, 0.00, 'MZ', 28);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(197, '453810', 0.00, 48.00, 0.00, 0.00, 0.00, 'MZ', 27);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(196, '453810', 0.00, 58.00, 0.00, 0.00, 0.00, 'MZ', 26);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(195, '453810', 0.00, 45.00, 0.00, 0.00, 0.00, 'MZ', 24);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(194, '453810', 0.00, 34.00, 0.00, 0.00, 0.00, 'MZ', 23);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(193, '453810', 0.00, 42.00, 0.00, 0.00, 0.00, 'SUP', 28);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(192, '453810', 0.00, 58.00, 0.00, 0.00, 0.00, 'SUP', 27);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(191, '453810', 0.00, 68.00, 0.00, 0.00, 0.00, 'SUP', 26);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(190, '453810', 0.00, 55.00, 0.00, 0.00, 0.00, 'SUP', 24);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(189, '453810', 0.00, 42.00, 0.00, 0.00, 0.00, 'SUP', 23);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(201, '453810', 0.00, 58.00, 0.00, 0.00, 0.00, 'DZ', 26);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(202, '453810', 0.00, 48.00, 0.00, 0.00, 0.00, 'DZ', 27);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(203, '453810', 0.00, 34.00, 0.00, 0.00, 0.00, 'DZ', 28);
        INSERT INTO `hotelsaisonen_preise` (`ID`, `HotelCode`, `OV`, `BB`, `HP`, `VP`, `AI`, `Kategorie_id`, `Saison_ID`) VALUES(208, '453810', 0.00, 45.00, 0.00, 0.00, 0.00, 'SUP', 29);
        die einzige enderung ist dass ich eine neue saison hinzugefügt habe und den preis für die kategorie SUP deffiniert habe.
        Auslesen Mit SUP = 6 ergebnisse Richtig
        Auslesen Mit DZ oder MZ = 5 ergebnisse falsch sollten auch 6 ergebnisse seinAuslesen Mit APP = 6 ergebnisse Richtig

        Kommentar


        • #5
          Zitat von pro-tech Beitrag anzeigen
          Auslesen Mit SUP = 6 ergebnisse Richtig
          Auslesen Mit DZ oder MZ = 5 ergebnisse falsch sollten auch 6 ergebnisse seinAuslesen Mit APP = 6 ergebnisse Richtig
          Also aus meiner Sicht ist das Ergebnis Deiner Abfrage sinngemäß korrekt. Wenn ich die Kategorien einzeln zähle, dann kommt ja exakt dieses Ergebnis raus.

          Code:
          mysql> SELECT Kategorie_id, count(*) AS anzahl
              ->   from hotelsaisonen_preise
              -> group by Kategorie_id;
          +--------------+--------+
          | Kategorie_id | anzahl |
          +--------------+--------+
          | DZ           |      5 |
          | MZ           |      5 |
          | SUP          |      6 |
          +--------------+--------+
          3 rows in set (0.01 sec)
          
          mysql>
          Habe ich die Frage falsch verstanden oder sind die Testdaten nicht korrekt?
          Ich verstehe nicht, wie bzw. warum Du bei 'DZ' auf 6 Rows kommen willst.

          Grüße
          Thomas

          Kommentar


          • #6
            hallo thomas
            ich mochte dass die nichtvergebenen saisonen bei DZ die saisons_id 29 auch angezeigt wird.
            die problematik ist wenn eine saison hinzugefügt wird und der preis für eine saison angegeben wird wird die saison für die anderen kategorienen nicht mehr angezeigt.

            Kommentar


            • #7
              Ein mögliche Lösung,

              Code:
              mysql> SELECT a.id, a.SaisonStart, b.saison_id
                  ->   FROM hotelsaisonen AS a
                  ->   JOIN hotelsaisonen_preise AS b
                  ->     ON a.id = b.saison_id
                  ->  WHERE b.kategorie_id = 'DZ'
                  ->
                  -> UNION
                  ->
                  -> SELECT a.id, a.SaisonStart, NULL AS saison_id
                  ->   FROM hotelsaisonen AS a
                  ->  WHERE a.id NOT IN ( SELECT b.saison_id FROM hotelsaisonen_preise AS b
                  ->                       WHERE b.kategorie_id = 'DZ' )
                  ->
                  ->
                  -> ORDER  BY 3 ASC;
              +----+-------------+-----------+
              | id | SaisonStart | saison_id |
              +----+-------------+-----------+
              | 29 | 2010-12-03  |      NULL |
              | 23 | 2010-04-30  |        23 |
              | 24 | 2010-07-10  |        24 |
              | 26 | 2010-07-24  |        26 |
              | 27 | 2010-08-21  |        27 |
              | 28 | 2010-09-11  |        28 |
              +----+-------------+-----------+
              6 rows in set (0.00 sec)
              
              mysql>
              Melde mich heute abend nochmal..

              Grüße
              Thomas

              Kommentar


              • #8
                WoW vilen dank hab dein select etwas erweitert
                Code:
                $select = "	SELECT a.id AS saisons_id, a.SaisonStart, a.SaisonEnd, b.saison_id, b.OV, b.BB, b.HP, b.VP, b.AI
                        	FROM hotelsaisonen AS a
                        	JOIN hotelsaisonen_preise AS b
                          	ON a.id = b.saison_id
                      		WHERE b.kategorie_id = '".$category."'
                     
                      		UNION
                     
                      		SELECT a.id AS saisons_id, a.SaisonStart, a.SaisonEnd, NULL AS saison_id, NULL AS OV, NULL AS BB, NULL AS HP, NULL AS VP, NULL AS AI
                        	FROM hotelsaisonen AS a
                       		WHERE a.id NOT IN ( SELECT b.saison_id FROM hotelsaisonen_preise AS b
                                            WHERE b.kategorie_id = '".$category."' )
                      		ORDER BY 3 ASC";

                Kommentar


                • #9
                  Zitat von pro-tech Beitrag anzeigen
                  WoW vilen dank hab dein select etwas erweitert
                  Code:
                  $select = "	SELECT a.id AS saisons_id, a.SaisonStart, a.SaisonEnd, b.saison_id, b.OV, b.BB, b.HP, b.VP, b.AI
                          	[....]
                        		ORDER BY 3 ASC";
                  Sehr gut, wie ich sehe ist der SQL nun okay so. Noch als Hinweis, der "ORDER BY 3" bedeutet, das nach der dritten Spalte a.SaisonEnd der Select-Liste sortiert wird.

                  Grüße
                  Thomas

                  Kommentar


                  • #10
                    Mal ne Frage ist es nicht ratsam die einzelnen SELECT-Statements zu klammern?
                    so in der art:
                    Code:
                    (...Select...) UNION (...Select2...) UNION (...Select3...) ORDER BY xyz
                    Ich frage nur, weil ich mal das Problem hatte, das ein SQL falsche Daten lieferte, weils net geklammert war...
                    "My software never has bugs, it just develops random features."
                    "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                    Kommentar


                    • #11
                      Klammern ist nicht notwendig und (..dass müßte ich nochmal probieren..) bei anderen Datenbank zum Teil syntaktisch falsch.

                      Frage: "..was sind falsche Ergebnisse..?"

                      Grüße
                      Thomas

                      Kommentar


                      • #12
                        Ich kann leider nimmer genau sagen, ist schon etwa 1 oder 2 Jahre her.
                        Es war ein SQL Statement, das über 3 oder 4 Bestellungstabellen ging, und knapp 2 DINA4 Seiten umfasste. Das Problem war glaube ich, das nicht alle Bestellungen angezeigt wurden, da glaube ich auh noch ein "GROUP BY" und "ODER BY" dabei. Auf jeden Fall la des am Zend Frmework, da dort der UNION-Select keine Klammern um die einzelnen SELECTs gesetzt hatte. Sobalb ich diese manuell geklammert habe, wars dann auch wieder richtig.

                        Sorry was genaueres kann ich leider nicht sagen!
                        "My software never has bugs, it just develops random features."
                        "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                        Kommentar

                        Lädt...
                        X