Verschiedene MySQL-Tabellen vergleichen

Du könntest in der elseif-Schleife ne temporäre variable setzen, die dir beim nächsten Mal sagt, ob du in dieser Schleife schonmal drinn warst.
Das ist aber kein schönes Softwaredesign. Mein Tip. Trenn mal PHP-Code und Ausgabe/HTML noch stärker, indem du zB erstmal alles was du ausgeben willst in ein entsprechend sortiertes array schreibst. das kannst du dann auch noch filtern und manipoulieren, bevor du es an einen template-parser übergibst.
 
Ich habe nun die SQL-Abfragen der Zu- bzw. Absagen getrennt. Was jetzt jedoch noch nicht funktioniert, ist die Zuordnung der Teilnehmermeldungen zu dem jeweiligen Termin.

WHERE termine_teilnehmer.termine_id = termine.id hat leider nicht funktioniert. Wenn ich statt termine.id jedoch einen festen Zahlenwert nehme, so funktioniert die Zuordnung. Natürlich dann nur für den einen Termin mit der entsprechenden ID. Habt Ihr eine Idee, wie ich die Bedingung noch in die SQL-Abfrage einbauen kann?

SQL-Abfragen:
PHP:
// Termine Teilnehmermeldungen Zusagen
function termine_teilnahme( $conid )
{
    if ($conid)
    {
        $sql = "SELECT
                    termine_teilnehmer.id,
                    termine_teilnehmer.benutzer_id,
                    termine_teilnehmer.termine_id,
                    termine_teilnehmer.teilnahme,
                    benutzer.nachname,
                    benutzer.vorname
                FROM
                    termine_teilnehmer
                    JOIN benutzer
                        ON termine_teilnehmer.benutzer_id = benutzer.id
                    JOIN termine
                        ON termine_teilnehmer.termine_id = termine.id
                    WHERE termine_teilnehmer.teilnahme = 1";
        $ergebnis = mysql_query( $sql, $conid );
        if (@mysql_num_rows( $ergebnis ) > 0)
        {
            while ($zeile = mysql_fetch_array( $ergebnis ))
            {
                $datensatz[$zeile['id']]['id']        = $zeile['id'];
                $datensatz[$zeile['id']]['pid']       = $zeile['termine_id'];
                $datensatz[$zeile['id']]['nachname']  = $zeile['nachname'];
                $datensatz[$zeile['id']]['vorname']   = $zeile['vorname'];
                $datensatz[$zeile['id']]['teilnahme'] = $zeile['teilnahme'];
            }
        }

        mysql_free_result( $ergebnis );
        return $datensatz;
    }
}

// Termine Teilnehmermeldungen Absagen
function termine_absage( $conid )
{
    if ($conid)
    {
        $sql = "SELECT
                    termine_teilnehmer.id,
                    termine_teilnehmer.benutzer_id,
                    termine_teilnehmer.termine_id,
                    termine_teilnehmer.teilnahme,
                    benutzer.nachname,
                    benutzer.vorname
                FROM
                    termine_teilnehmer
                    JOIN benutzer
                        ON termine_teilnehmer.benutzer_id = benutzer.id
                    JOIN termine
                        ON termine_teilnehmer.termine_id = termine.id
                    WHERE termine_teilnehmer.teilnahme = 0";
        $ergebnis = mysql_query( $sql, $conid );
        if (@mysql_num_rows( $ergebnis ) > 0)
        {
            while ($zeile = mysql_fetch_array( $ergebnis ))
            {
                $datensatz[$zeile['id']]['id']        = $zeile['id'];
                $datensatz[$zeile['id']]['pid']       = $zeile['termine_id'];
                $datensatz[$zeile['id']]['nachname']  = $zeile['nachname'];
                $datensatz[$zeile['id']]['vorname']   = $zeile['vorname'];
                $datensatz[$zeile['id']]['teilnahme'] = $zeile['teilnahme'];
            }
        }

        mysql_free_result( $ergebnis );
        return $datensatz;
    }
}

PHP-Ausgabe:
PHP:
    if (isset ($_SESSION['user_id']))  //Nur für eingeloggte User
    {
      if (is_array($termine_teilnahme))
      {
        echo ' <h2>Teilnehmer</h2><br /> ';
        echo ' <ul class="ul"> ';
        foreach ($termine_teilnahme as $teilnahme)
        {
          echo ' <li class="li-quadrat">' . $teilnahme['vorname'] . ' ' . $teilnahme['nachname'] . '</li> ';
        }
      }
      else
      {
        echo ' <li class="li-none">Es gibt noch keine Teilnehmer.</li> ';
      }
      echo ' </ul> ';
    }
    if (isset ($_SESSION['user_id']))
    {
      if (is_array($termine_absage))
      {
        echo ' <h2>Teilnehmer</h2><br /> ';
        echo ' <ul class="ul"> ';
        foreach ($termine_absage as $absage)
        {
          echo ' <li class="li-quadrat">' . $absage['vorname'] . ' ' . $absage['nachname'] . '</li> ';
        }
      }
      else
      {
        echo ' <li class="li-none">Es gibt noch keine Absagen.</li> ';
      }
      echo ' </ul> ';
    }

Alternative SQL-Abfrage:
PHP:
        $sql = "SELECT
                    termine_teilnehmer.*,
                    benutzer.*,
                    termine.*
                FROM
                    termine_teilnehmer, benutzer, termine
                WHERE
                    termine_teilnehmer.teilnahme = 1
                    AND
                    termine_teilnehmer.benutzer_id = benutzer.id
                    AND
                    termine_teilnehmer.termine_id = termine.id";

Also, es funktioniert auch ohne JOINS, doch das Ergebnis bleibt das selbe. Es werden bei jedem Termin alle Zu- und Absagen der ganzen Tabelle ausgegeben.
 
Zuletzt bearbeitet:
PHP:
        $sql = "SELECT
                    termine_teilnehmer.*,
                    benutzer.*,
                    termine.*
                FROM
                    termine_teilnehmer, benutzer, termine
                WHERE
                    termine_teilnehmer.teilnahme = 1
                    AND
                    termine_teilnehmer.benutzer_id = benutzer.id
                    AND
                    termine_teilnehmer.termine_id = termine.id";

Also, es funktioniert auch ohne JOINS, doch das Ergebnis bleibt das selbe. Es werden bei jedem Termin alle Zu- und Absagen der ganzen Tabelle ausgegeben.

Sorry, wenn ich dazwischen klug******e, aber auch der angegebene SQL ist ein JOIN. Joins sind immer Verbindungen zwischen SQL-Tabellen. Hierbei handelt es sich um das sog. Equi-Join.

Nur mal wegen der Klarstellung ;-)
 
DIE LÖSUNG:

SQL-Abfrage (für Zusagen)
PHP:
// Termine Teilnehmermeldungen Zusagen
function termine_teilnahme( $conid )
{
    if ($conid)
    {
        $sql = "SELECT
                    termine_teilnehmer.id,
                    termine_teilnehmer.benutzer_id,
                    termine_teilnehmer.termine_id,
                    termine_teilnehmer.teilnahme AS teilnahme,
                    benutzer.nachname,
                    benutzer.vorname
                FROM
                    termine_teilnehmer
                    JOIN benutzer
                        ON termine_teilnehmer.benutzer_id = benutzer.id
                    JOIN termine
                        ON termine_teilnehmer.termine_id = termine.id
                    WHERE teilnahme = 1"; // 1 = Zusage
        $ergebnis = mysql_query( $sql, $conid );
        if (@mysql_num_rows( $ergebnis ) > 0)
        {
            while ($zeile = mysql_fetch_array( $ergebnis ))
            {
                $datensatz[$zeile['termine_id']][$zeile['id']]['termine_id'] = $zeile['termine_id'];
                $datensatz[$zeile['termine_id']][$zeile['id']]['nachname']   = $zeile['nachname'];
                $datensatz[$zeile['termine_id']][$zeile['id']]['vorname']    = $zeile['vorname'];
            }
        }

        mysql_free_result( $ergebnis );
        return $datensatz;
    }
}

/* Datenbankverbindung öffnen */
$conid = dbconnect();

// Termine Teilnehmermeldungen Zusagen laden
$termine_teilnahme = termine_teilnahme( $conid );


PHP-Ausgabe (für Zusagen)

PHP:
      if ($termine_teilnahme[$eintrag['id']] != NULL)
      {
        foreach ($termine_teilnahme[$eintrag['id']] as $teilnahme)
        {
            echo ' ' . $teilnahme['vorname'] . ' ' . $teilnahme['nachname'] . ' ';
        }
      }
      else
      {
        echo ' Es gibt noch keine Teilnehmer. ';
      }

Vielen Dank für die große Unterstützung!
 

Neue Beiträge

Zurück