Eindämmung von SQL-Abfrage-Werten

  • Themenstarter Themenstarter Patrik Garten
  • Beginndatum Beginndatum
P

Patrik Garten

Hallo nochmals, das zweite mal für heute,

ich habe nun folgendes Problem, ich habe ja eine Datenbank-Abfrage nun gestaltet:

SQL:
$query = "SELECT
                        pa_name,
                        pa_vorname,
                        pa_titel,
                        substring(100+extract(DAY FROM pa_geb_datum)from 2 for 2)||
                            '.'|| substring(100+extract(MONTH FROM pa_geb_datum)from 2 for 2)||
                            '.'|| extract(YEAR FROM pa_geb_datum),
                        vs_kas_bezeichnung,
                        vs_versich_art,
                        vs_mart,
                        pa_behandler,
                        pa_pat_nr,
                        vs_ab_datum
                    FROM
                        patient,
                        versichertenstatus
                    WHERE
                        pa_pat_nr=vs_pat_nr AND
                        LOWER(PA_PAT_NR) LIKE '".$text."%';";

Jetzt habe ich folgendes Problem, da sich der Eintrag vs__kas_bezeichnung wiederholt, brauche ich für folgenden PHP-Code nun eine Art Eindämmung, dass er das vs_ab_datum ausliest und nur noch die neuesten Einträge der Tabelle ausgibt.

PHP:
    echo '<table border="1" align="center" style="background-color: white; min-width: 800px; font-family: Arial;">';
        echo '<tr>';
            echo '<th>Name, ';
            echo 'Vorname';
            echo '<span style="white-space:pre">	</span>';
            echo 'Titel</th>';
            echo '<th>Geb.-Datum</th>';
            echo '<th>Kr.-Kass.-Namen</th>';
            echo '<th>Priv.</th>';
            echo '<th>Mitgl.</th>';
            echo '<th>Stam.</th>';
            echo '<th>Pat-Nr.</th>';
        echo '</tr>';
    while($zeile = ibase_fetch_row($dbabfrage))
    {
        echo '<tr>';

        for($j=0; $j<1; $j++)
        {
            echo '<td>'.(string)$zeile[0].', '.(string)$zeile[1].'<span style="white-space:pre">	</span>'.(string)$zeile[2].'</td>';
        }

        for($j=3; $j<5; $j++)
        {
            echo '<td>' . (string)$zeile[$j] . '</td>';

            if(strlen($zeile[4]) >= '15')
            {
                $zeile[4]=substr($zeile[4], 0,15);
            }
        }

        if($zeile[5] == '1')
        {
            echo '<td> </td>';
        }
        elseif($zeile[5] == '2')
        {
            echo '<td>P</td>';
        }

        switch($zeile[6])
        {
            case '1':
                echo '<td>M</td>';
                break;

            case '3':
                echo '<td>F</td>';
                break;

            case '5':
                echo '<td>R</td>';
                break;

            default:
                echo '<td>-</td>';
                break;
        }

        echo '<td>' . (string)$zeile[7] . '</td>';

        for($j=8; $j<9; $j++)
        {
            echo '<td>' . (string)$zeile[$j] . '</td>';
        }

        echo '</tr>';
    }
    echo '</table>';

Die Tabelle sieht z.B. so aus:
Abt, Heike 08.02.1966 AOK Coburg M He 366
Abt, Heike 08.02.1966 AOK Coburg M He 366
Abt, Heike 08.02.1966 AOK Coburg M He 366
Abt, Heike 08.02.1966 AOK Bayern M He 366

Da die Kundin des öfteren die Krankenkasse gewechselt hat, existieren mehrere Einträge von ihr.

Hat vielleicht jemand eine Idee wie ich das anstellen könnte, das ich wirklich nur die neuesten Einträge der Zeile ausgeben kann.
Damit es vielleicht etwas verständlich ist auch noch ein Screenshot der SQL-Tabelle versichertenstatus in dem sich der Eintrag vs_ab_datum befindet.
Das rot eingerahmte ist ein und die selbe Person und ich brauche allerdings nur den mit dem aktuellsten Datum.

Ich bedanke mich jetzt schon einmal sehr herzlich bei euch, für eure Hilfe/Tipps/Tricks/etc.
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    286,7 KB · Aufrufe: 26
Zuletzt bearbeitet von einem Moderator:
Am einfachsten im SQL.
Su kannst noch eine Unterabfrage einbauen, die das höchste Datum pro Patient ausliest
Ich würd deine WHERE-Bedinung mit der Patientennummer gleich ins Subquery verfrachten. Je früher gefiltert wird, umso schneller ist die Verarbeitung
SQL:
SELECT
	--TODO: Hier deine Felder eintragen
FROM
	patient AS pa,
	versichertenstatus AS vs,
	(
		SELECT
			vs_pat_nr,
			MAX(vs_ab_datum) AS max_vs_ab_datum
		FROM
			versichertenstatus
		WHERE
			LOWER(vs_pat_nr) LIKE '{$text}%'
		GROUP BY
			vs_pat_nr
	) AS select_date
WHERE
	pa.pa_pat_nr = vs.vs_pat_nr
	AND vs.vs_pat_nr = select_date.vs_pat_nr
	AND vs.vs_ab_datum = select_date.max_vs_ab_datum
 
Zuletzt bearbeitet von einem Moderator:
Hm, ich weiß nicht wieso, aber er scheint den Code schön brav durch zu gehen,
weil er mir keinen Fehler anzeigt, allerdings zeigt er mir den selben Inhalt wie
zuvor. Ich kann mir das gerade überhaupt nicht erklären, schon langsam
übersteigt das meine Fähigkeiten, wenn ich ehrlich bin. o.ô
 
Ohne die Daten und ohne zu sehen wie dein Code jetzt aussieht - nein, ich kann dir nicht helfen
 
Es hat sich nichts an meinem Code geändert, ich bin immer noch so weit wie am Freitag.
 
Wenn du nichts geändert hast, dann ist es logisch dass es noch das gleiche Resultat liefert.
 
Liegt woll daran das ich einfach nicht mehr weiterkomme, bzw. weiß was ich machen soll. ;-)
 
Tja, und mit deinen Antworten auf meine Fragen ist es mir unmöglich zu sehen was nicht gehen sollte, denn der Code stimmt meines Wissens soweit. Aber ohne testdaten und ohne dein jetztiger Stand des Codes (gut, laut deiner Aussage immer noch der Code aus dem ersten Posting dieses Threads) ist es mir nicht möglich dir zu helfen.
Wir können noch stundenlang aneinander vorbeireden - ich habe für mich hier geschlossen. Der Ansatz wie du das lösen musst steht im Thread.

Tschüss.
 
Hm, wie auch immer.. der Ansatz funktioniert keinen Meter, mir wird eine Fehlermeldung um die Ohren geschmissen, naja, aber trotzdem danke für den Versuch zu helfen. :-)
 
Zurück