Best. Anzahl aus MySql Datenbank auslesen

Hallo,

Ich habe mal eine Frage:

Und zwar ich habe eine Datenbank die heißt wingi darin sind 2 Tabellen (werden durch ein Formular befüllt) die eine heißt termine5a und die andere hausaufgaben5a jetzt lasse ich beide in 2Tabellen auf meiner HP ausgeben. Jetzt möchte ich jedoch das nur die zuletzt eingetragenen 3 Termine und 3 Hausaufgaben ausgegeben werden.
Wie kann ich das machen?

Gruß Nikolas

ORDER BY und LIMIT:
dev.mysql.com/doc/refman/5.1/de/ … -rows.html

Für Limit hab ich keinen Eintrag in der MySQL-Doc gefunden, funktioniert aber ganz einfach:

Das funktioniert leider nicht da ich in der tabelle chemie ja keine spalte mit datum habe.
Noch eine andere Möglichkeit?

Wo kommt die auf einmal her?

Dann füge eine ein.
Wie sonst willst du eine zeitliche Sortierung herstellen?

„Zuletzt eingetragen” gibt es aus Sicht der Datenbank nicht. Datensätze sind unsortiert, so lange bis du eine Sortierung explizit herstellst.

(Über eine auto_increment-ID wäre eine Sortierung zwar möglich - aber sinnvoll wäre das nicht. Eine ID dient ausschliesslich dazu, einen Datensatz identifizierbar zu machen.)

Dann mach “order by id” oder so. Du musst ja irgendwas einzigartiges haben oder halt ein Datumsfeld. Sonst weiß ja weder die Datenbank noch das Script wann der Datensatz eingetragen wurde.

EDIT: Ok war zu langsam :smiley:

Was heißt unsortiert?
Sie bleiben doch einfach in der Reihenfolge stehen wie sie eingetragen worden sind oder?

Nein nicht direkt. Die Datenbank muss irgendein Feld haben nachdem sie sortieren kann.
Und standardmäßig nimmt sie glaube ich das erste einer Tabelle bzw. den Primary_Key (Primärschlüssel). Da du weder einen einzigartigen Identifier (Identifizierer) hast noch ein Datum des Eintrags hast, kannst du nicht herausfinden wann du etwas eingetragen hast, bzw. was zuerst und was zuletzt eingetragen wurde.
Du brauchst also ein Feld ID oder Datum in welchem eine einzigartige Zahl, am besten aufsteigend immer einer mehr, gespeichert wird oder ein Datum.
Die Zahl kann MySQL von alleine speichern indem du auto_increment für die Spalte auswählst wenn du sie erstellst und Primary Key damit MySQL weiß, dass es der Primärschlüssel ist.
Dann kannst du nach der ID sortieren (der neueste Eintrag hat die höchste ID und der älteste die niedrigste, was die 1 wäre). Oder du machst noch ein Feld Datum wo du einen Unix Timestamp oder ähnliches speicherst und sortierst nach dem Feld beim Abfragen.

Link zum Wörterbuch gefällig? :slight_smile:

Nein.
Das garantiert dir eine Datenbank i.a.R. definitiv nicht.

(Es mag teilweise zufällig so sein - aber auch dann kann es sich jederzeit ändern, bspw. dann, wenn die Speicherung der Daten durch Optimierung geändert wird o.ä.)

Faustregel beim Umgang mit Datenbanken: Daten sind als unsortiert zu betrachten, so lange du keine Vorschrift zur Sortierung angibst.

Der SQL-Standard schreibt keine Sortierung vor, allerdings hab ich es bis jetzt noch nicht erlebt, dass sich die Reihenfolge einer MySQL oder Postgres Datenbank willkürlich ändert -> Normalerweise bleiben die Daten sortiert.
Du hast allerdings keine Garantie dafür!
Wenn du sortierte Daten brauchst --> SORTIEREN! (Zeitaufwand ist damit normalerweise kaum verbunden)

ja ich glaube wir verstehen uns hier falsch (macht nix kann ja mal vorkommen :smiley: ) ich erkläre es nochmal neu.

also so sieht es bei phpmyadmin aus:

datenbank:wingi
und in der datenbank ist dann chemie
und in chemie ist dann
hausaufgaben5a
und termine5a

jetzt möchte ich aus hausaufgaben5a und termine 5a die letzten 3einträge ausgeben.
zum sortieren müßte ich ja jetzt id in chemie einfügen oder?
aber das bringt mir nichts da ich ja nicht termine und hausaufgeben nach id sortieren kann/ will(Es wird ja getrennt eingegeben).
Oder verstehe ich jetzt etwas falsch?

Frage2(Neu):
Hiermit trage ich termine und hausaufgaben die über ein Formular kommen in die db ein.

if(empty($_REQUEST['5aha']))
    {
    echo "<TR><TH COLSPAN=2>5a</TH></TR><TR><TD>Hausaufgeben:</TD><TD>xxx</TD></TR>";
    }
else
    {
    $eintrag1 = "INSERT INTO chemie (hausaufgaben5a) VALUES ('".$_POST["5aha"]."')";    
    $eintragen1 = mysql_query($eintrag1);
    echo "<TR><TH COLSPAN=2>5a</TH></TR><TR><TD>Hausaufgeben:</TD><TD>".$_POST["5aha"]."</TD></TR>";
    }

if(empty($_REQUEST['5at']))
    {
    echo "<TR><TD>Termin:</TD><TD>xxx</TD></TR>";
    }
else
    {
    $eintrag2 = "INSERT INTO chemie (termine5a) VALUES ('".$_POST["5at"]."')";
    $eintragen2 = mysql_query($eintrag2);
    echo "<TR><TD>Termin:</TD><TD>".$_POST["5at"]."</TD></TR>";
    }

Wenn ich mir jetzt per:

$result = mysql_query("SELECT termine5a FROM `chemie`");
$num_rows = mysql_num_rows($result);

num_rows ausgeben lasse warum erscheint dann 2 obwohl ich nur einen Termin eingetragen hab?

EDIT:
Wenn das alles hier Quatsch ist was ich möchte oder ich die Tabellen und Spalten anders anlegen sollte dann schreibe ich hier mal meinen Gedanken und dann kann mir vieleicht jemand ne Lösungsmöglichkeit vorschlagen.:

Ich habe eine Seite für Schüler die dort ihre Hausaufgaben und Termine nachschauen können. Jetzt möchte ich über ein “Control-Center” die neuen Hausaufgeben und evtl. Termine in die MySql eintragen. Und dann auf der eigentlichen Seite in einer Tabelle wieder auslesen lassen.
Und das Ganze natürlich für mehrere Klassen.

Gruß Nikolas

Irgendwie ist die komplette Tabellenstruktur eigenartig :ps:
Du hast eine Datenbank xyz
In dieser ist die Tabelle chemie?!
Und die hat die Spalten hausaufgaben5a und termine5a?!
Und immer wenn du einen Eintrag machst erstellt er einen neuen Datensatz und schreibt entweder in die Spalte hausaufgaben5a oder termine5a den Text.
Und nun hast du 2 Termine eingetragen. Du holst alle Einträge aus der Tabelle Chemie, jedoch nur die Spalte termine5a von jedem Eintrag.
Die ganze Logik ist eigentlich völlig falsch. Es sollte mal jemand das Script überarbeiten.
Aber davon mal abgesehen, du hast keine Spalte wo das Datum der Eintragung eingetragen wird oder die ID. Also kannst du nicht die letzten 3 zuverlässig ausgeben lassen, da du pech haben kannst, dass er die alten Termine und HAs ausgibt. Denn du musst ja nach irgendwas sortieren und das wäre die ID oder ein Datum.

[quote=“wingi”]Wenn ich mir jetzt per:

$result = mysql_query("SELECT termine5a FROM `chemie`");
$num_rows = mysql_num_rows($result);

num_rows ausgeben lasse warum erscheint dann 2 obwohl ich nur einen Termin eingetragen hab?[/quote]
Dann irrst du dich wohl.

Nutze phpMyAdmin, um das zu überprüfen.

@inad

Das dass eigenartig ist habe ich jetzt auch gemerkt :ps:

Deshalb hier nochmal meinen EDIT:

[quote]EDIT:
Wenn das alles hier Quatsch ist was ich möchte oder ich die Tabellen und Spalten anders anlegen sollte dann schreibe ich hier mal meinen Gedanken und dann kann mir vieleicht jemand ne Lösungsmöglichkeit vorschlagen.:

Ich habe eine Seite für Schüler die dort ihre Hausaufgaben und Termine nachschauen können. Jetzt möchte ich über ein „Control-Center“ die neuen Hausaufgeben und evtl. Termine in die MySql eintragen. Und dann auf der eigentlichen Seite in einer Tabelle wieder auslesen lassen.
Und das Ganze natürlich für mehrere Klassen.

Gruß Nikolas[/quote]

EDIT:@chris es ist aber so habe auch schon geleert und neu eingetragen(1mal) er gibt 2 aus ist aber jetzt auch egal wenn jemand ne bessre lösung hat.

Die sinnvolle Lösung wurde dir schon genannt - füge eine Spalte hinzu, in der du den Zeitpunkt des Eintrages abspeicherst, und verwende diese Spalte für die zeitliche Sortierung.

Das kann nicht sein.

Was du falsch machst, ist aus der minimalen Problembeschreibung bisher nicht erkennbar.

Also ich gebe dir erstmal den SQL Code für die Tabellen, für mehr habe ich gerade leider keine Zeit :smiley:

CREATE TABLE `termine` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`text` TEXT NOT NULL ,
`datum` INT NOT NULL ,
`erstellt` INT NOT NULL
);
CREATE TABLE `lan`.`hausaufgaben` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`text` TEXT NOT NULL ,
`erstellt` INT NOT NULL
);

Das kannst du ganz einfach per PHPMyAdmin in deiner Datenbank unter SQL ausführen.
Dann hast du zwei Tabellen. Eine für die HAs, eine für die Termine.
Ich denke die Namen der Spalten erklären sich von selber. Wenn andere bessere Vorschläge haben, dann sollen sie die Posten ich bin müde :smiley:

Hi, wie schon inaD gesagt hat, Struktur überarbeiten.Ich würd 2 Tabellen anlegen:

chemie_hausaufgaben, chemie_termine
Feld:

id(als autoincrement)
datum(format date)
beschreibung

du könntest natürlich noch das datum erweitern, als eintragsdatum und fälligkeitsdatum.

Dann schreibst du deine SQL Abfrage so, dass nur die “noch fälligen” einträge angezeigt werden, also alle bis zum aktuellen Datum.

müsste in etwa so lauten, kann mir mysql aber immer so schlecht merken:

“Select * FROM $tabellenname WHERE datum >= CURDATE()”

du kannst das ganze natürlich auch für alle fächer ausbauen, und ein zusätliches Feld für das Fach anlegen, und dann kannst du auch filtern welche hausaufgaben aus welchem Fach angezeigt werden. Beim eintragen ist dann ein Dropdownmenü zur Fachauswahl empfehlenswert.

EDIT: haben einige gepostet zwischenzeitlich, willst du mehrere Fächer oder für mehrere Klassen die jeweilige Chemiesache?

Danke an inad!!!

Und dass dann für jede Klasse?
also:chemie_hausaufgaben5a, chemie_termine5a
chemie_hausaufgaben5b, chemie_termine5b
chemie_hausaufgaben5c, chemie_termine5c
chemie_hausaufgaben6a, chemie_termine6a

Richtig?

Viel zu umständlich, mach ein zusätzliches Feld mit klasse, und Trag da dann die klasse ein

Ich steh da en bissel aufm Schlauch :ps:
Aber wenn jede Klasse an einem anderen Tag was anderes aufbekommt wie geht das dann?

Du kannst doch die Ergebnisse Filter

SELECT … WHERE klasse=klasse5a