Hilfe - Unterabfrage macht Faxen

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

  • Hilfe - Unterabfrage macht Faxen

    Hallo,

    entweder sehe ich den Wald vor lauter Bäumen nicht
    oder ich kapiers einfach nicht:

    Ich habe eine Tabelle re_parameter:
    PHP-Code:
    CREATE TABLE `re_parameter` (
      `
    rep_idint(10unsigned NOT NULL auto_increment,
      `
    unternehmenenum('1','2V'NOT NULL default 'Auxilion',
      `
    l_idint(10unsigned NOT NULL default '0',
      `
    blageenum('Beguenstigter','Versorgungssumme','Umwandlung','Disagio'
    character set latin1 collate latin1_german1_ci NOT NULL default 
    'Beguenstigter',
      `
    wertdecimal(10,3unsigned NOT NULL default '0.000',
      `
    re_stellungenum('monatlich','jaehrlich','einmalig'NOT NULL default 'monatlich',
      `
    datumdate NOT NULL default '0000-00-00',
      `
    dauerenum('Austritt','Sparen','Leistung'NOT NULL default 'Austritt',
      `
    beginnNachsmallint(3unsigned NOT NULL default '0',
      `
    rabattdecimal(7,2unsigned NOT NULL default '0.00',
      
    PRIMARY KEY  (`rep_id`)
    ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Parameter
     Rechnungsstellung' 
    AUTO_INCREMENT=167 
    Es können zu verschiedenen Zeitpunkten unterschiedliche
    Rechnungsparameter gelten, deshalb habe ich mir foilgnde Abfrage
    gebastelt:
    PHP-Code:
    $sql="select rep1.*, vm.vzahlweise ";
    $sql.="from re_parameter as rep1, leistungsplaene as lp, 
    versorgungsmodelle as vm where rep1.datum = "
    ;
    $sql.="(select max(rep2.datum) from re_parameter as rep2 where 
    rep2.datum <='
    $this->aktuell' and rep1.l_id=rep2.l_id) and ";
    $sql.="rep1.unternehmen ='1' and rep1.l_id=lp.l_id and 
    lp.t_id='
    $_SESSION[t_id]' and lp.v_id=vm.v_id;"
    Tabelle Leistungsplaene ist foreign-key bei re_parameter und
    versorgungsmodelle foreign-key bei leistungsplaene.

    Jetzt habe ich folgende Eintraege in der Tabelle re_parameter
    stehen:
    PHP-Code:
    INSERT INTO `re_parameter` (`rep_id`, `unternehmen`, `l_id`, 
    `
    blage`, `wert`, `re_stellung`, `datum`, `dauer`, `beginnNach`, 
    `
    rabatt`) VALUES (165'1'47'Umwandlung'5.000'monatlich'
    '2004-11-01''Sparen'1220.00);
    INSERT INTO `re_parameter` (`rep_id`, `unternehmen`, `l_id`, 
    `
    blage`, `wert`, `re_stellung`, `datum`, `dauer`, `beginnNach`, 
    `
    rabatt`) VALUES (166'1'72'Umwandlung'5.000'monatlich'
    '2004-12-01''Sparen'1220.00); 
    In einer form gibt man ein Datum ein und von diesem Datum wird
    immer 24 Monate rückwirkend geschaut in einer Schleife, welche
    Rechnungsparameter für dieses Datum gelten. Also immer das
    hoechste Datum zum Abfragezeitpunkt.

    Komischerweise funktioniert das auch meistens, nur aber bei den
    obigen Eintraegen nicht:

    Frage ich
    PHP-Code:
    $this->aktuell=2004-12-31 
    ab, so erhalte ich
    die beiden Datensaetze aus der Tabelle. Frage ich aber z.B.
    PHP-Code:
    $this->aktuell=2005-02-01 
    ab, erhalte ich als Anzahl 0.

    Jetzt habe ich spasseshalber mal die Dateumseintraege in der
    Tabelle von 2004-12-31 auf 2005-12-31 geaendert und habe
    PHP-Code:
    %this->aktuell=2006-12-31 
    abgefragt. Und siehe da, ich
    erhalte beide Datensaetze aus der Tabelle.

    Ich raffe es nicht, es muessten doch entweder bei beiden Abfrage
    die Datensaetze rauskommen oder aber bei keiner der Abfragen.

    Bitte Leute, helft mir, ich weiss einfach nicht weiter.

    Danke euch im Voraus,

    Gruss Thomas
    Zuletzt geändert von yabbax; 20.04.2007, 10:04.

  • #2
    Re: Hilfe - Unterabfrage macht Faxen

    Regeln lesen, Code umbrechen.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Hallo nochmal,

      ich habe jetzt folgendes herausgefunden - es ist wohl ein
      Abfragefehler:

      Es soll ja immer pro l_id ein Datensatz herauskommen. Sobald aber
      die Datumseintraege unterschiedlich sind, funktioniert das nicht
      mehr, weil immer nur der hoechste Wert genommen wird.

      Zusatzlich muss ich den Code noh um folgendes erweitern, dann
      klappt es jetzt zumindest für gleiche Datumseintraege:
      PHP-Code:
      $sql="select rep1.*, vm.vzahlweise ";
      $sql.="from re_parameter as rep1, leistungsplaene as lp, versorgungsmodelle as vm where ";
      $sql.="rep1.unternehmen like '1' and rep1.l_id=lp.l_id and 
      lp.t_id='
      $_SESSION[t_id]' and lp.v_id=vm.v_id ";
      $sql.="and rep1.datum= ";
      $sql.="(select max(rep2.datum) from re_parameter as rep2 ";
      $sql.="where rep2.datum <='$this->aktuell' "

      $sql.="and rep2.unternehmen like '1')  "
      Es muesste also moeglich sein, dass die Unterabfrage 2 Ergebnisse
      ausgibt, wie. zB. bei Gruppierung nach l_id.

      Frage ist, wie realisiere ich dies?

      Danke Thomas
      Zuletzt geändert von yabbax; 20.04.2007, 10:05.

      Kommentar


      • #4
        Mach bitte das, worauf ich dich gerade schon hinwies.
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          sorry, war zeitgleich meine Antwort mit deinem Hinweis.

          Kommentar


          • #6
            Ist das Problem nur mit zwei Abfragen loesbar?

            z.B.:
            PHP-Code:
            $sql="select max(rep1.rep_id) as rep_id,
            rep1.wert, rep1.re_stellung, rep1.l_id, rep1.blage,
            rep1.beginnNach, vm.vzahlweise "
            ;
            $sql.="from re_parameter as rep1, leistungsplaene as lp, 
            versorgungsmodelle as vm where "
            ;
            $sql.="rep1.unternehmen like '$this->unternehmen%' and 
            rep1.l_id=lp.l_id and lp.t_id='
            $_SESSION[t_id]' and lp.v_id=vm.v_id ";
            $sql.="and rep1.datum<='$this->aktuell' group by rep1.l_id "

            Das Ergebnis dann in einer Schleife durchlaufen und in einer neuen Abfrage dann gezielt nach rep_id abfragen?

            Gruss Thomas

            Kommentar


            • #7
              Habs jetzt erst mal so geloest. Vielleicht weiss jemand noch ne bessere Loesung?

              PHP-Code:
              $sql="select max(rep1.rep_id) as rep_id ";
              $sql.="from re_parameter as rep1, leistungsplaene as lp where ";
              $sql.="rep1.unternehmen like '$this->unternehmen%' and 
                         rep1.l_id=lp.l_id and lp.t_id='
              $_SESSION[t_id]' ";
              $sql.="and rep1.datum<='$this->aktuell' group by rep1.l_id ";
              $erg=mysql_query($sql);
              $zerg=mysql_num_rows($erg);
                      
              if(
              $zerg>0)
              {
                 
              $sql="select rep.*, vm.vzahlweise ";
                 
              $sql.="from re_parameter as rep, leistungsplaene as lp, 
                            versorgungsmodelle as vm "
              ;
                
              $sql.="where rep.l_id=lp.l_id and lp.v_id=vm.v_id and (";
                          
                for(
              $i=0$i<$zerg$i++)
                {
                  
              $tmp=mysql_fetch_object($erg);
                  if(
              $i>0)
                  {    
              $sql.="or ";    }
                  
              $sql.="rep.rep_id='$tmp->rep_id' ";
              }
              $sql.=")"
              Waere toll wenn es eleganter zu loesen waere.
              Thomas

              Kommentar

              Lädt...
              X