tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
ERLEDIGT
NEIN
ANTWORTEN
21
ZUGRIFFE
882
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Ist zwar keine Antwort weil:
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen
    Willst du dein Code nicht formatieren?
    Auch SQLs sind Formatiert lesbar. In deiner Form leider nicht.

    PHP-Code:
    //Vergleich mal deins
    $query_absenzen_unent sprintf("SELECT COUNT(*) FROM `pobi_adressen` as `t1` left JOIN `pobi_adrterm` as `t2` ON `t1`.`ad_ID` = `t2`.`adte_IDadr` WHERE (adte_status = 3) AND (adte_IDadr = %s) AND  ((ad_austritt = 0 and ad_aufgenommen <> 0) or (ad_probejahr <> 0 and ad_aufgenommen = 0 and ad_austritt = 0))"GetSQLValueString($colname_absenzen_unent"int")); 

    //versus das
    $query_absenzen_anw  = <<<SQL
    SELECT 
        COUNT(*) 
    FROM 
        pobi_adressen as t1 
        LEFT JOIN pobi_adrterm AS t2 
            ON t1.ad_ID = t2.adte_IDadr
    WHERE 
        t2.adte_status = 2 
        AND t2.adte_IDadr = %s 
        AND (
                (t1.ad_austritt = 0 
                AND t1.ad_aufgenommen <> 0) 
            OR 
                (t1.ad_probejahr <> 0 
                AND t1.ad_aufgenommen = 0 
                AND t1.ad_austritt = 0)
            ) 
    ORDER BY
        adte_status ASC
    SQL;
    $query_absenzen_anw sprintf($query_absenzen_anwGetSQLValueString($colname_absenzen_anw"int")); 
    Zudem, alles was in der do{} drin ist, kann man auch einrücken um zu sehen von wo bis wo die Schleife geht
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  2. #17
    Phips_CH Phips_CH ist offline Mitglied Bronze
    Registriert seit
    Feb 2011
    Beiträge
    45
    Hallo Yaslaw

    Ich kann dich gut verstehen wenn du nicht erfreut bist über unformatierte Codes.
    Mann verzeihe mir,
    Ich werde mich bemühen, künftig meine Codes anschaulicher darzustellen.

    Vielleicht hilfst du mir trotzdem weiter bei meinem Problem.

    Wie schreib ich aus einer Abfrage mehrere Ergebnisse in ein Array und das in einer Schleife?

    Freundliche Grüsse
    Phips_CH
     

  3. #18
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Sorry, ich versteh leider immer noch nicht was du genau was du haben willst, was bei deinen Arrays nicht funktioniert (Fehlermeldungen? Falsche Resultate? Wenn ja, welche?), was ein Array

    item: $totalRows_absenzen_anw = mysql_num_rows($absenzen_anw);
    $totalRows_absenzen_anw ist logischerweise immer 1, da ein SELECT COUNT(*) FROM immer genau eine Zeile ausgibt.
    Also kannst du dir diese Verwirrung sparen

    item: Wenn du in den Count-SQL ein Feld-Alias setzt, kannst du nachher eleganter drauf zugreifen
    Code sql:
    1
    2
    3
    4
    5
    
    SELECT
        COUNT(*) AS cnt_adr
    FROM
        pobi_adressen
    ...
    Dann kannst du so drauf zugreiffen
    PHP-Code:
    echo $row_absenzen_anw['cnt_adr']; 
    item: Die SQLS lassen sich wahrscheinlich verknüpfen. Hab aber grad keine Lust alles zu formatieren, zu analysieren, zu verstehen und umzubauen.

    item: in der folgenden Zeile setzt du dein Array zusammen.
    $array[0] = array(nachname => $row_mitglieder['ad_nachname'], vorname => $row_mitglieder['ad_vorname'], count => $row_absenzen_anw['COUNT(*)'], unent => $row_absenzen_unent['COUNT(*)']);
    Du schreibst aber immer alles in den Index 0 von $array. Somit überschreibst du bei jedem Durchgang durch die Schleife den Eintrag auf Index 0. Wenn du ein 2-Dimensionalen Array haben willst, dann lass die Nummer weg damit jedes mal ein euer Eintrag in den Array geschrieben wird
    PHP-Code:
    //Array initialzieren
    $array = array();
    do{
        ...
        
    //Hier keinen Index angeben
        
    $array[] = array(
                
    nachname => $row_mitglieder['ad_nachname'], 
                
    vorname => $row_mitglieder['ad_vorname'], 
                
    count => $row_absenzen_anw['COUNT(*)'], 
                
    unent => $row_absenzen_unent['COUNT(*)']
        );
        ....
    } while (
    $row_mitglieder mysql_fetch_assoc($mitglieder))?> 
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  4. #19
    Avatar von Napofis
    Napofis Napofis ist offline require 'brain.php';
    Registriert seit
    Jun 2007
    Ort
    Bayern
    Beiträge
    587
    So wenn ich das richtig sehe gibt es 2 entscheidende Tabellen mit folgenden Feldern (oder so ungefähr):

    pobi_adrterm
    adte_IDmitglied
    adte_IDadr
    adte_status

    pobi_mitglieder
    ad_id
    ad_nachname
    ad_vorname

    Mit folgender Abfrage kann man die gewünschte Ergebnismenge erhalten, ohne diese Zwischenabfragen in der do-while Schleife und das mit den Arrays ist auch völlig überflüssig.

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    
    SELECT `m`.`ad_vorname` AS `Vorname`,`m`.`ad_nachname` AS `Nachname`,
      SUM(IF(`t`.`adte_status`=1,1,0)) AS `Entschuldigt`,
      SUM(IF(`t`.`adte_status`=2,1,0)) AS `Anwesend`,
      SUM(IF(`t`.`adte_status`=3,1,0)) AS `unentschuldigt`
    FROM `pobi_mitglieder` AS `m`
    LEFT JOIN `pobi_adrterm` AS `t` ON `m`.`ad_id`=`t`.`adte_IDmitglied`
    GROUP BY `adte_IDmitglied`
    ORDER BY `Anwesend` DESC

    Die Ausgabe sieht dann ungefähr so aus:
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    +---------+----------+--------------+----------+----------------+
    | Vorname | Nachname | Entschuldigt | Anwesend | unentschuldigt |
    +---------+----------+--------------+----------+----------------+
    | Bar1    | Foo1     |            0 |        2 |              1 |
    | Bar3    | Foo3     |            0 |        1 |              0 |
    | Bar2    | Foo2     |            0 |        0 |              0 |
    +---------+----------+--------------+----------+----------------+

    Mit den richtigen Tabellen könnte man das Statement richtig formulieren ...
     

  5. #20
    Phips_CH Phips_CH ist offline Mitglied Bronze
    Registriert seit
    Feb 2011
    Beiträge
    45
    Ich habe zwei Tabellen.

    zum einen die Tabelle
    pobi_adressenmit den Feldern
    ad_ID
    ad_Nachname
    ad_vorname
    ad_austritt
    ad_aufgenommen
    ad_probejahr

    zum andern die Tabelle
    pobi_adrterm die aus der Feldern
    adte_ID
    adte_IDadr
    adte_IDter
    adte_status

    Die Tabelle pobi_adrterm ist eine Verknüpfungstabelle. in adte_IDadr steht der Wert von pobi_adressen.ad_ID drin. In adte_IDter steh die ID einer weiteren Tabelle, wo ich alle Termine und Anlässe speichere.

    mit:
    PHP-Code:
    WHERE (adte_status 2
        AND (
    adte_IDadr = %s
        AND ((
    ad_austritt 
        
    AND ad_aufgenommen <> 0
        OR  (
    ad_probejahr <> 
        
    AND ad_aufgenommen 
        
    AND ad_austritt 0)) 
    frag ich ab, ob ein Mitglied noch im Ferien ist. Denn ich möchte nur diese Anzeigen.

    Nun möchte ich für jedes Mitglied die Anzahl der Datensätze, aus der Tabelle pobi_adrterm wo bei adte_status eine 2 steht.

    Die Ausgabe würde (sollte) dann so aussehen. hinter jedem Vor-/Nachname steht dann wie oft er Anwesend war (bei adte_status eine 2 steht) und zur Info wie oft er Unentschuldigt fern blieb (bei adte_status eine 3 steht).
    In der Tabelle sollte dann das Mitglied, welches am meisten Anwesend war, zuoberst stehen.

    Wie kann ich die Ergebnisse dann Ausgeben?
     

  6. #21
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Also, so kriegst du die adress-Ids inkl. Zähler sortiert nach Anzahl
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    SELECT
        adte_IDadr,
        COUNT(*) AS cnt
    FROM
        pobi_adrterm
    WHERE
        adte_status = 2
    GROUP BY
        adte_IDadr
    ORDER BY
        COUNT(*) DESC
    Und das ganez mit den Adressdaten verknüpft:
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    SELECT
        adte_IDadr,
        ad_Nachname,
        ad_vorname,
        COUNT(*) AS cnt
    FROM
        pobi_adrterm
        INNER JOIN pobi_adressen
            ON adte_ID = ad_ID
    WHERE
        adte_status = 2
    GROUP BY
        adte_IDadr,
        ad_Nachname,
        ad_vorname
    ORDER BY
        COUNT(*) DESC

    Das kannst du so einmal auslesen und ganz normale als Tabelle mit PHP ausgeben
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  7. #22
    Phips_CH Phips_CH ist offline Mitglied Bronze
    Registriert seit
    Feb 2011
    Beiträge
    45
    Vielen Herzlichen Dank.
    Hat wunderbar funktioniert.
    Ohne eure Hilfe hätte ich das nie herausgefunden.

    INNER Join musste ich etwas anders Lösen, damit es mir die Namen angezeigt hat.

    PHP-Code:
    FROM `pobi_adrterm` as `t1inner JOIN `pobi_adressen` as `t2ON `t1`.`adte_IDadr` = `t2`.`ad_ID
    Wenn ich jetzt nun aus der dritten Tabelle pobi_termine, dessen ID in der Spalte adte_IDter der Verknüpfungstabelle pobi_adrtermsteht, auch in Join einbeziehen?

    Denn das Datum für den Termin steht in der Tabelle pobi_termine ich möchte aber nur die Anzahl Datensätze zurück für einen bestimmten Zeitraum. (Saison, Jahr, etc.)
     

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 28.04.11, 11:49
  2. Kategorien richtig ordnen
    Von emptynick im Forum PHP
    Antworten: 3
    Letzter Beitrag: 25.08.07, 14:33
  3. Antworten: 0
    Letzter Beitrag: 23.04.06, 11:34
  4. Select count(*) VS. Select count(column_name)
    Von Thomas Darimont im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 11.12.05, 15:19
  5. SELECT Abfrage in einer WHILE Schleife?
    Von Tom Joke im Forum PHP
    Antworten: 5
    Letzter Beitrag: 02.12.03, 16:49