MySQL Datenbank
Melina
- datenbank
Guten Morgen,
bevor ich meine Datenbank für Termine anlegen wollte ich euch fragen, wie ihr diese anlegen würdet und später dieses Ergebnis bzw. Darstellung zu erreichen?
Meine ID ist folgende:
CREATE TABLE IF NOT EXISTS termine
(
id
int(11) NOT NULL,
monat
varchar(50) NOT NULL,
datum\_von
varchar(50) NOT NULL,
datum\_bis
varchar(50) NOT NULL,
titel
varchar(200) NOT NULL,
beschreibung
text NOT NULL,
url
varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Und ein Eintrag würde dann so aussehen:
INSERT INTO termine
(id
, monat
, datum\_von
, datum\_bis
, titel
, beschreibung
, url
) VALUES
(1, 'Janaur 2015', '10.01.', '12.01.', 'Das ist ein Test', 'Hier eine kleine Beschreibung', 'http://wwww.');
Moin
CREATE TABLE IF NOT EXISTS
termine
(
id
int(11) NOT NULL,
monat
varchar(50) NOT NULL,
datum\_von
varchar(50) NOT NULL,
datum\_bis
varchar(50) NOT NULL,
titel
varchar(200) NOT NULL,
beschreibung
text NOT NULL,
url
varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;Und ein Eintrag würde dann so aussehen:
INSERT INTO
termine
(id
,monat
,datum\_von
,datum\_bis
,titel
,beschreibung
,url
) VALUES
(1, 'Janaur 2015', '10.01.', '12.01.', 'Das ist ein Test', 'Hier eine kleine Beschreibung', 'http://wwww.');
Es gibt einen Datentyp Date. Damit kannst du viele gute Sachen anstellen. Also ich würde das folgendermaßen machen:
CREATE TABLE IF NOT EXISTS `termine` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`datum_von` date NOT NULL,
`datum_bis` date NOT NULL,
`titel` varchar(200) NOT NULL,
`beschreibung` text NOT NULL,
`url` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Und die Speicherung dann
INSERT INTO `termine` (`datum_von`, `datum_bis`, `titel`, `beschreibung`, `url`) VALUES
('2015-01-12', '2015-01-10', 'Das ist ein Test', 'Hier eine kleine Beschreibung', 'http://wwww.');
Also immer schön die dafür vorgesehenen Datentypen nutzen!
Gruß Bobby
Hallo,
Es gibt einen Datentyp Date. Damit kannst du viele gute Sachen anstellen.
genau, das wollte ich auch vorschlagen - zusammen mit dem Hinweis, dass die separate Monat-Spalte zu Beginn dann redundant ist. Deswegen hast du sie ja auch schon weggelassen.
INSERT INTO termine
(datum_von
, datum_bis
, titel
, beschreibung
, url
) VALUES
('2015-01-12', '2015-01-10', 'Das ist ein Test', 'Hier eine kleine Beschreibung', 'http://wwww.');
Das Beispiel ist wohl eine Veranstaltung, die rückwärts läuft? ;-)
Vielleicht sollte es Teil der späteren Plausibilitätsprüfung sein, dass das Ende-Datum nicht vor dem Beginn-Datum liegt.
Ciao,
Martin
--
I do take my work seriously, and the way to do that is not to take yourself too seriously.
(Alan Rickman, britischer Schauspieler)
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
Moin
Das Beispiel ist wohl eine Veranstaltung, die rückwärts läuft? ;-)
Vielleicht sollte es Teil der späteren Plausibilitätsprüfung sein, dass das Ende-Datum nicht vor dem Beginn-Datum liegt.
LOL... Mein Fehler. Natürlich wäre hier eine Prüfung von Vorteil. ;)
Gruß Bobby
Hallo,
Es gibt einen Datentyp Date. Damit kannst du viele gute Sachen anstellen. Also ich würde das folgendermaßen machen:
CREATE TABLE IF NOT EXISTS
termine
(
id
int(11) NOT NULL AUTO_INCREMENT,
datum_von
date NOT NULL,
datum_bis
date NOT NULL,
titel
varchar(200) NOT NULL,
beschreibung
text NOT NULL,
url
varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
>
> Und die Speicherung dann
>
> ~~~sql
> INSERT INTO `termine` (`datum_von`, `datum_bis`, `titel`, `beschreibung`, `url`) VALUES
> ('2015-01-12', '2015-01-10', 'Das ist ein Test', 'Hier eine kleine Beschreibung', 'http://wwww.');
danke für die Verbesserung. Ich sehe du hast mein Feld Monat raus geschmissen warum? Wie du in meinem Bild sehen kannst, möchte ich den Monat getrennt vom Termin auflisten bzw. nur einmal und zwar zu Beginn anzeigen lassen. Laut deinem Code kann ich dieses nicht mehr machen oder war es nur ein versehen den Monat raus zu werfen?
Moin
danke für die Verbesserung. Ich sehe du hast mein Feld Monat raus geschmissen warum? Wie du in meinem Bild sehen kannst, möchte ich den Monat getrennt vom Termin auflisten bzw. nur einmal und zwar zu Beginn anzeigen lassen. Laut deinem Code kann ich dieses nicht mehr machen oder war es nur ein versehen den Monat raus zu werfen?
du kannst aus der DAtenbank mittels MONTH auch extra die Monate herausgefiltert ausgeben aus dem 'datum_von -Feld'
Dies ist aber eine Frage des SELECT. Die Speicherung wäre redundant.
Gruß Bobby
Und zu Deiner Darstellungsfrage (sprich dass die Monate als Liste erscheinen): das ist von der Speicherung relativ unabhängig. Du musst dazu den Monat auch nicht extra in ein Feld speichern. Das wäre komplett redundant, da diese Information schon im date_from steht.
Ein Beispiel der Darstellung in php:
Du liest alle Termine ein (otional zw. einem Datumsinterval) ermittelst den jew. Monat, erstellst ein Array damit, führst array_unique aus, iteriest über diesen Array.
Cheers,
Baba
Moin
Und zu Deiner Darstellungsfrage (sprich dass die Monate als Liste erscheinen): das ist von der Speicherung relativ unabhängig. Du musst dazu den Monat auch nicht extra in ein Feld speichern. Das wäre komplett redundant, da diese Information schon im date_from steht.
Ein Beispiel der Darstellung in php:
Du liest alle Termine ein (otional zw. einem Datumsinterval) ermittelst den jew. Monat, erstellst ein Array damit, führst array_unique aus, iteriest über diesen Array.
na das ist doch etwas umständlich. Man kann im Select über die MONTH()-Funktion direkt den Monat als Zahl ausgeben. Mit MONTHNAME() und den entsprechenden LC-Einstellungen sogar den deutschen Monatsnamen!
Gruß Bobby
Man kann im Select über die MONTH()-Funktion direkt den Monat als Zahl ausgeben.
Gut. So ermittelst Du den Monatsnamen. Die Frage war aber, wie kommt man zu der angestrebten Darstellung vom OP.
Cheers,
Baba
Moin
Man kann im Select über die MONTH()-Funktion direkt den Monat als Zahl ausgeben.
Gut. So ermittelst Du den Monatsnamen. Die Frage war aber, wie kommt man zu der angestrebten Darstellung vom OP.
Über Gruppenwechsel. So wie in der Informatik üblich. ;)
Da muss kein Array noch extra bearbeitet werden, außer vielleicht sortiert. ;)
Gruß Bobby
Moin,
Über Gruppenwechsel. So wie in der Informatik üblich. ;)
Da muss kein Array noch extra bearbeitet werden, außer vielleicht sortiert. ;)
da ich mich mit PHP nicht wirklich gut auskennen, wäre es doch für mich am einfachsten den Monat mit anzugeben und dann diesen auch auszulesen und zwar nur einmal?
Moin
Moin,
Über Gruppenwechsel. So wie in der Informatik üblich. ;)
Da muss kein Array noch extra bearbeitet werden, außer vielleicht sortiert. ;)
da ich mich mit PHP nicht wirklich gut auskennen, wäre es doch für mich am einfachsten den Monat mit anzugeben und dann diesen auch auszulesen und zwar nur einmal?
Dein SELECT müste wie folgt heißen:
SELECT *, MONTH(datum_von) AS Monat FROM termine ORDER BY datum_von ASC
oder mit Monatsnamen (abhängig von der LC-Einstellung, ob deutsch oder englisch)
SELECT *, MONTHNAME(datum_von) AS MONAT FROM termine ORDER BY datum_von ASC
Du kannst die Ausgabe Datum_von und Datum_bis mit DATE_FORMAT() ebenso formatieren, dass es in dem gewünschten Format erscheint
Dann hast du das selbe Ergebnis wie vorher. ;)
im PHP
$ergebnisarray //Ergebnis aus der DB-Abfrage, die du vorher gemacht hast
// Variable für temporären Monatsnamen initialisieren
$monat="";
foreach($ergebnisarray AS $value)
{
// Gruppenwechsel
if($value['Monat']!=$monat)
{
$monat=$value['Monat'];
echo $monat;
}
// Ausgabe Eintrag
echo $value['datum_von'];
echo $value['datum_bis'];
echo $value['titel'];
echo $value['beschreibung']
}
Das beispiel ist nur EXEMPLARISCH. Natürlich muss alles formatiert werden und die Ausgabe so geschehen wie du das möchtest. Das ist dann aber eine reine HTML-Aufgabe.
Versuche aus dem SQL möglichst viel qualifiziert zurückgeben zu lassen. Das erspart Arbeit im PHP und das tut der Performance gut
Gruß Bobby
// Gruppenwechsel
if($value['Monat']!=$monat)
{
Besser!
Cheers,
Baba
--
Baba kommt von Basketball
Liebe Mitdenker,
liebe Wissende,
liebe Neugierige,
da ich mich mit PHP nicht wirklich gut auskennen, wäre es doch für mich am einfachsten den Monat mit anzugeben und dann diesen auch auszulesen und zwar nur einmal?
Das geht auch mit SQL und Benutzervariablen.
Solange sich der Monat nicht ändert von einem Satz zum anderen, wird statdessen ein Leerstring ausgegeben. Dafür müssen die Datensätze nur nach Monaten sortiert ausgegeben werden
set @aktmonat = '';
select if(monat = @aktmonat ,' " ', @aktmonat := monat)) as monatsname, beschreibung
from termine order by monat;
Spirituelle Grüße
Euer Robert
Liebe Mitdenker,
liebe Wissende,
liebe Neugierige,
ja!
Liebe Mitdenker,
liebe Wissende,
liebe Neugierige,
Das geht auch mit SQL und Benutzervariablen.
Solange sich der Monat nicht ändert von einem Satz zum anderen, wird statdessen ein Leerstring ausgegeben. Dafür müssen die Datensätze nur nach Monaten sortiert ausgegeben werden
set @aktmonat = '';
select if(monat = @aktmonat ,' " ', @aktmonat := monat)) as monatsname, beschreibung
from termine order by monat;
Ich bin mir hier nicht sicher, ob die Query so schon sicher ist.
Ich vermute, dass man der mit einem unbedingten Subselect arbeiten muss, das nach Monaten sortiert wird und das dann erst an das Select mit der Bedingung übergeben darf.
Das ist hier jetzt zwar kein gefährlicher Fall von Reihenfolgemissachtung, aber der Ordnung halber wolle ich das mal in den Raum stellen!
Sortiert wird i.d.R. das _Abfrageergebnis_ und nicht die abzufragende Menge.
Spirituelle Grüße
Euer Robert
Tach!
set @aktmonat = '';
select if(monat = @aktmonat ,' " ', @aktmonat := monat)) as monatsname, beschreibung
from termine order by monat;
Ich bin mir hier nicht sicher, ob die Query so schon sicher ist.
Das dürfte sie nicht sein.
Ich vermute, dass man der mit einem unbedingten Subselect arbeiten muss, das nach Monaten sortiert wird und das dann erst an das Select mit der Bedingung übergeben darf.
Ich vermute, dass das nicht zielführend ist.
SELECT * FROM (SELECT * FROM test ORDER BY spalte) t2
Die Ausgabe war jedenfalls nicht nach spalte sortiert. Ohne die äußere Query war sie das aber.
Das ist hier jetzt zwar kein gefährlicher Fall von Reihenfolgemissachtung, aber der Ordnung halber wolle ich das mal in den Raum stellen!
Sortiert wird i.d.R. das _Abfrageergebnis_ und nicht die abzufragende Menge.
Richtig. Und zwar auch erst nachdem die SELECT-Klausel berechnet wurde, denn man bezieht sich ja beim OEDER BY auf einen (Alias-)Namen oder eine Spaltennummer der SELECT-Klausel. Zum Sortieren danach muss der Ausdruck bereits berechnet sein. (Fürs Verständnis: Die SELECT-Klausel ist nur der erste Teil des SELECT-Statements, bis ausschließlich zum FROM.)
Weiterhin stehen im Kapitel zu den User-Defined Variables einige weitere Fallstricke. Das muss man erstmal gründlich testen, ob ein solches Statement das gewünschte Ergebnis bringt - und dnan ist es noch nicht mal garantiert.
Das Handbuch schweigt sich auch darüber aus, ob IF() nach dem Kurzschlussverfahren arbeitet oder nicht. IF() müsste dazu anders als Funktionen im Allgemeinen arbeiten, denn normalerweise werden zuerst die Argumente berechnet und übergeben, und dann die Funktion ausgeführt, dass sie daraus ein Ergebnis erzeugen kann. @aktmonat := monat ist ja kein Lambda-Ausdruck, der erst vom Inneren der Funktion ausgeführt wird. Das ist aber von dir beabsichtigt.
dedlfix.
Liebe Mitdenker,
liebe Wissende,
liebe Neugierige,
ja!
Guten Morgen,
bevor ich meine Datenbank für Termine anlegen wollte ich euch fragen, wie ihr diese anlegen würdet und später dieses Ergebnis bzw. Darstellung zu erreichen?
Meine ID ist folgende:
[code lang =sql]
CREATE TABLE IF NOT EXISTS termine
(
id
int(11) NOT NULL,
monat
varchar(50) NOT NULL,
datum\_von
varchar(50) NOT NULL,
datum\_bis
varchar(50) NOT NULL,
titel
varchar(200) NOT NULL,
beschreibung
text NOT NULL,
url
varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
[/code]
Und ein Eintrag würde dann so aussehen:
INSERT INTO
termine
(id
,monat
,datum\_von
,datum\_bis
,titel
,beschreibung
,url
) VALUES
(1, 'Janaur 2015', '10.01.', '12.01.', 'Das ist ein Test', 'Hier eine kleine Beschreibung', 'http://wwww.');
Drei Dinge sollten wir wissen:
CREATE TABLE IF NOT EXISTS `termine` (
`id` int(11) NOT NULL,
`anfang` datetime NOT NULL,
`ende` datetime,
`titel` varchar(255) NOT NULL,
`id_ort` int(11) NOT NULL,
`beschreibung` text,
`url` varchar(255)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- und da fehlen ggf. noch diverse Metadaten-Spalten
Weitere Fragen:
Das Insert-Statement hängt davon ab, ob sich die Termine überlappen müssen, ob der Eintragende dafür angemeldet sein muss, usw.
Spirituelle Grüße
Euer Robert
Hallo,
Drei Dinge sollten wir wissen:
- Wer soll die Termine eintragen in die Datenbank?
- Dürfen sich die Termine überlappen?
- Haben die eigentlich auch eine Anfangs- und Endzeit?
ich weiß zwar nicht was diese Fragen mit meinem Problem zu tun haben, aber ich will sie dir gerne beantworten:
- Wer soll die Termine eintragen in die Datenbank?
Jeder der den Link kennt und entsprechende Admin Rechte hat!
- Dürfen sich die Termine überlappen?
Selbstverständlich.
- Haben die eigentlich auch eine Anfangs- und Endzeit?
Jedes Event hat natürlich ein Beginn und ein Ende, was aber in diesem Fall keine Rolle spielt, da ich mit den Terminen nichts machen werde als für ein komplettes Jahr ausgeben. Auch sollten Termine die in der Vergangenheit liegen angezeigt werden.
CREATE TABLE IF NOT EXISTS
termine
(
id
int(11) NOT NULL,
anfang
datetime NOT NULL,
ende
datetime,
titel
varchar(255) NOT NULL,
id_ort
int(11) NOT NULL,
beschreibung
text,
url
varchar(255)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- und da fehlen ggf. noch diverse Metadaten-Spalten
Metadaten liegen bei mir in einer anderen Tabelle und haben mit den Terminen nichts zu tun.
> - Gibt es regelmäßige Termine?
Kann gut sein, kenne ich zu diesem Zeitpunkt allerdings nicht und spielt auch keine Rolle für mein Vorhaben. Sollte ein Termin 2016 wieder stattfinden, wird er wieder eingetragen, da es 100% eine andere Beschreibung gibt.
> - Dürfen die Termine editiert (Update) werden?
Hat mit der Ausgabe überhaupt nichts zu tun
> - Ist der Ort egal?
Auch dieses hat mit der Ausgabe nichts zu tun. Ob ich in das Feld "Köln, Berlin, München" oder "Privat bei mir daheim" schreibe, spielt absolut keine Rolle.
> Das Insert-Statement hängt davon ab, ob sich die Termine überlappen müssen, ob der Eintragende dafür angemeldet sein muss, usw.
Es war hier nie die Frage nach einem Insert und ob ein User angemeldet sein.
Liebe Mitdenker,
liebe Wissende,
liebe Neugierige,
ja!
Schade, dass Du so arrogant bist.
Spirituelle Grüße
Euer Robert
Hallo,
Schade, dass Du so arrogant bist.
arrogant wäre ich, wenn ich zu dir gesagt hätte "Leck mich am Arsch, was geht dich das an!" Ich bin auf deine Fragen eingegangen obwohl diese mit diesem Thema wie z.B. das speichern der Daten und ob nur ein Admin die Daten eintragen darf nichts zu tun hat.
Warum bin ich also arrogant?
Om nah hoo pez nyeetz, Melina!
Warum bin ich also arrogant?
Nun ja, für mich entsteht auch dieser Eindruck:
Du schreibst im Eröffnungsbeitrag
bevor ich meine Datenbank für Termine anlegen wollte ich euch fragen, wie ihr diese anlegen würdet und später dieses Ergebnis bzw. Darstellung zu erreichen?
„*bevor* ich meine Datenbank … anlege“
Dann kommen Ergänzungsfragen, die aus meiner Sicht unmittelbar mit der Struktur einer DB zu tun haben, bzw. deren Antworten unmittelbaren Einfluss auf die Umsetzung der Datenbank haben, d.h. Fragen, die man sich *unbedingt* stellen sollte, *während* man seinen Datenbankentwurf zum Beispiel mithilfe eines ERM visualisiert, die du abtust mit
ich weiß zwar nicht was diese Fragen mit meinem Problem zu tun haben
=== schnipp ===
- Dürfen die Termine editiert (Update) werden?
Hat mit der Ausgabe überhaupt nichts zu tun
- Ist der Ort egal?
Auch dieses hat mit der Ausgabe nichts zu tun. Ob ich in das Feld "Köln, Berlin, München" oder "Privat bei mir daheim" schreibe, spielt absolut keine Rolle.
Das Insert-Statement hängt davon ab, ob sich die Termine überlappen müssen, ob der Eintragende dafür angemeldet sein muss, usw.
Es war hier nie die Frage nach einem Insert und ob ein User angemeldet sein.
=== schnapp ===
Die Frage war: „Wie würdet ihr eine Datenbank für Termine anlegen?“ Die Antworten auf die gestellten Fragen haben *entscheidenden* Einfluss auf die Struktur der Datenbank.
Matthias