2 Fragen zu MySQL
wucher wichtel
- datenbank
0 dedlfix
0 rob0 Vinzenz Mai0 Danke
wucher wichtel
Hallo!
Ich habe zwei Fragen zu MySQL. Die Erste: Wie sieht eine Abfrage aus, mit der ich alle Datensätze einer Tabelle bekomme, aber nur die letzten drei nicht? Wie muss ich das schreiben? In Verbindung mit PHP und mehreren Abfragen könnte ich das zwar zusammenmurksen, aber eigentlich sollte soetwas doch über MySQL auch gehen.
Und die zweite Frage ist: Ich habe ein Feld von dem Typ ENUM. Wie kann ich mir alle Möglichkeiten, die ich bei ENUM angegeben habe, mir ausgeben lassen? Bei PhpMyAdmin wird das eingesetzt. Also muss es irgendwie gehen. Aber ich habe im Internet nichts dazu gefunden.
Danke für eure Hilfe.
ciao, ww
echo $begrüßung;
Wie sieht eine Abfrage aus, mit der ich alle Datensätze einer Tabelle bekomme, aber nur die letzten drei nicht?
Woran erkennst du die letzten drei Datensätze? Wenn du diese Frage geklärt hast ist es nur noch eine Frage der WHERE-Klausel.
Allgemeiner, dafür aber mit zwei Abfragen: Limitiere die Abfrage auf Ergebniswert einer COUNT-Abfrage abzüglich 3. Allerdings will LIMIT nur konstante Werte und keine Ausdrücke. Du musst das also anderswo berechnen.
Ich habe ein Feld von dem Typ ENUM. Wie kann ich mir alle Möglichkeiten, die ich bei ENUM angegeben habe, mir ausgeben lassen?
SHOW COLUMNS ... plus etwas Stringverarbeitung wäre eine Möglichkeit. Vielleicht findest unter den SHOW-Statements noch ein passenderes.
echo "$verabschiedung $name";
Hallo!
Woran erkennst du die letzten drei Datensätze?
Am Datum.
Wenn du diese Frage geklärt hast ist es nur noch eine Frage der WHERE-Klausel.
Und wie müsste das aussehen?
Allgemeiner, dafür aber mit zwei Abfragen: Limitiere die Abfrage auf Ergebniswert einer COUNT-Abfrage abzüglich 3. Allerdings will LIMIT nur konstante Werte und keine Ausdrücke. Du musst das also anderswo berechnen.
Wo? Geht das auch mit MySQL? Dass LIMIT keine Ausdrücke will, habe ich auch herausgefunden. Mir fiel dann nur die Möglichkeit ein, die Anzahl aller Einträge - 3 mit PHP auszurechnen.
SHOW COLUMNS ... plus etwas Stringverarbeitung wäre eine Möglichkeit. Vielleicht findest unter den SHOW-Statements noch ein passenderes.
Ok, das werde ich nachher gleichmal anschauen. Vielen Dank.
ciao, ww
echo $begrüßung;
Woran erkennst du die letzten drei Datensätze?
Am Datum.
Das glaube ich nicht,
Wenn du diese Frage geklärt hast ist es nur noch eine Frage der WHERE-Klausel.
Und wie müsste das aussehen?
denn dann könntest du diesen Datumswert mit einem anderen Datum vergleichen, und wüsstest dann, ob du den Datensatz nehmen willst oder nicht. Wenn du genau einen Datensatz pro Tag hast, mag das Datum als Entscheidungskriterium gut sein, sonst nicht.
Wo? Geht das auch mit MySQL? Dass LIMIT keine Ausdrücke will, habe ich auch herausgefunden. Mir fiel dann nur die Möglichkeit ein, die Anzahl aller Einträge - 3 mit PHP auszurechnen.
Wenn LIMIT einen konstanten Wert haben möchte, musst du variable Werte vor dem Erstellen des Statements berechnen. Und ja, wenn PHP deine abfragende Umgebung ist, dann wäre eine PHP-Lösung sicher angebracht. Oder du lässt die Ergebnismenge rückwärts sortieren und limitierst die ersten 3 weg.
echo "$verabschiedung $name";
Hallo!
Woran erkennst du die letzten drei Datensätze?
Am Datum.Das glaube ich nicht,
Es ist ein DATETIME-Feld mit der Eigenschaft UNIQUE. Also eindeutig.
Oder du lässt die Ergebnismenge rückwärts sortieren und limitierst die ersten 3 weg.
Wie würde das denn aussehen? Mir ist da keine Möglichkeit eingefallen. Danke!
ciao, ww
echo $begrüßung;
Woran erkennst du die letzten drei Datensätze?
Am Datum.
Das glaube ich nicht,
Es ist ein DATETIME-Feld mit der Eigenschaft UNIQUE. Also eindeutig.
Darum geht es nicht. Die Frage ist: Kannst du anhand eines beliebigen Feldinhalts - Datum oder auch was anderes - feststellen, welches die drei letzten Datensätze sind. Und das ist nicht gegeben, solange du nicht z.B. weißt: Für jede $zeiteinheit exisitiert ein Datensatz. Also alles was nach $jetzt minus 3 × $zeiteinheit kommt sind die letzten drei und die will ich nicht haben. Ansonsten ist das Datum als Kriterium für "letzten 3" ungeeignet.
Oder du lässt die Ergebnismenge rückwärts sortieren und limitierst die ersten 3 weg.
Wie würde das denn aussehen? Mir ist da keine Möglichkeit eingefallen. Danke!
SELECT ... FROM ... ORDER BY ... DESC LIMIT 3, 42000000000
echo "$verabschiedung $name";
Hallo!
Darum geht es nicht. Die Frage ist: Kannst du anhand eines beliebigen Feldinhalts - Datum oder auch was anderes - feststellen, welches die drei letzten Datensätze sind. Und das ist nicht gegeben, solange du nicht z.B. weißt: Für jede $zeiteinheit exisitiert ein Datensatz. Also alles was nach $jetzt minus 3 × $zeiteinheit kommt sind die letzten drei und die will ich nicht haben. Ansonsten ist das Datum als Kriterium für "letzten 3" ungeeignet.
Das lese ich mir durch, wenn ich vollständig aufgewacht bin. Dann verstehe ich es sicher :)
SELECT ... FROM ... ORDER BY ... DESC LIMIT 3, 42000000000
Ah. Daran habe ich nicht gedacht.
Vielen Dank für deine Hilfe!
ciao, ww
Hi!
Wie sieht eine Abfrage aus, mit der ich alle Datensätze einer Tabelle bekomme, aber nur die letzten drei nicht?
Was sind "die letzten drei"?
Wie kann man das erkennen? Verfügt deine Tabelle über eine Spalte, in der du das Eintragsdatum gespeichert hast?
Ich habe ein Feld von dem Typ ENUM. Wie kann ich mir alle Möglichkeiten, die ich bei ENUM angegeben habe, mir ausgeben lassen?
Wie meinst du das? Ich verstehe nicht so recht, was du machen willst.
Mit einem
SHOW COLUMNS FROM tabelle
könntest du dir die Struktur deiner Tabelle ansehen. Dort würden dann auch die Möglichkeiten gezeigt, die du deinem ENUM-Feld gegeben hast.
Meinst du vielleicht so etwas?
Schöner Gruß,
rob
Hallo!
Was sind "die letzten drei"?
Oh. Hab ich vergessen anzugeben. Es gibt eine Spalte für's Datum.
Ich habe ein Feld von dem Typ ENUM. Wie kann ich mir alle Möglichkeiten, die ich bei ENUM angegeben habe, mir ausgeben lassen?
Wie meinst du das? Ich verstehe nicht so recht, was du machen willst.
Angenommen ich habe angegeben, dass ENUM nur die Strings "HTML", "JavaScript" und "CSS" enthalten darf. Dann möchte ich, dass ich diese abfragen kann und in ein <option>-Tag schreiben. Aber das dann ins HTML bringen ist kein Problem. Ich schau mir dann mal SHOW COLUMNS an. Danke erstmal!
ciao, ww
Hallo,
Was sind "die letzten drei"?
Oh. Hab ich vergessen anzugeben. Es gibt eine Spalte für's Datum.
kannst Du ausschließen, dass jeder Datumswert nur einmal vorkommt?
Wenn nein, dann hast Du ein Problem:
Beispiel:
id | datum
----------------
17 | 2007-05-27
19 | 2007-05-27
3 | 2007-05-27
146 | 2007-05-27
Welches sind nun die drei letzten Datensätze?
Angenommen ich habe angegeben, dass ENUM nur die Strings "HTML", "JavaScript" und "CSS" enthalten darf. Dann möchte ich, dass ich diese abfragen kann und in ein <option>-Tag schreiben.
Das war der Anwendungsfall, den ich mir vorstellen konnte ...
Freundliche Grüße
Vinzenz
Hallo!
kannst Du ausschließen, dass jeder Datumswert nur einmal vorkommt?
Wenn nein, dann hast Du ein Problem:
Die Spalte ist vom Typ DATETIME. Also ist sie bis auf die Sekunde genau. Da dürfte es eigentlich keine Probleme geben. Da müssten zwei Leute mit unterschiedlichen IP-Adressen innerhalb von einer Sekunde jeweils einen Kommentar abgeben. Das halte ich für unwarscheinlich. Aber angenommen dies passiert: Würde ein UNIQUE bei DATETIME abhilfe schaffen? Das würde schon gehen, oder?
Beispiel:
id | datum
17 | 2007-05-27
19 | 2007-05-27
3 | 2007-05-27
146 | 2007-05-27Welches sind nun die drei letzten Datensätze?
Angenommen das Beispiel würde es tatsächlich geben. Was würde MySQL machen? Einfach irgendwelche 3 von diesen 4 Einträgen zurückgeben? Oder mit einem Fehler abbrechen?
Danke schön!
ciao, ww
Hallo
Aber angenommen dies passiert: Würde ein UNIQUE bei DATETIME abhilfe schaffen? Das würde schon gehen, oder?
Ja, Deine Skriptlogik sollte allerdings den Fehler der Schlüsselverletzung beim
Einfügen berücksichtigen und nach Fehlschlagen des Einfügens die Operation
einfach erneut vornehmen (solange, bis es geklappt hat).
Beispiel:
id | datum
17 | 2007-05-27
19 | 2007-05-27
3 | 2007-05-27
146 | 2007-05-27Welches sind nun die drei letzten Datensätze?
Angenommen das Beispiel würde es tatsächlich geben. Was würde MySQL machen? Einfach irgendwelche 3 von diesen 4 Einträgen zurückgeben?
Ja. Einfach irgendwelche drei. Möchtest Du ganz bestimmte Daten haben, so musst
Du das dem Datenbankmanagementsystem (DBMS) explizit vorschreiben.
Oder mit einem Fehler abbrechen?
Nein, wieso? Das ist kein Fehler für das DBMS. Nur ein Fehler in der Anwendungslogik.
Diese ist einem DBMS gleichgültig.
Freundliche Grüße
Vinzenz
Hallo!
Ja, Deine Skriptlogik sollte allerdings den Fehler der Schlüsselverletzung beim
Einfügen berücksichtigen und nach Fehlschlagen des Einfügens die Operation
einfach erneut vornehmen (solange, bis es geklappt hat).
Ok, das werde ich so machen.
Oder mit einem Fehler abbrechen?
Nein, wieso? Das ist kein Fehler für das DBMS. Nur ein Fehler in der Anwendungslogik.
Diese ist einem DBMS gleichgültig.
Ok, ich war mir nur nicht sicher. Vielen Dank für die Hilfe!
ciao, ww
Hallo
Ich habe zwei Fragen zu MySQL. Die Erste: Wie sieht eine Abfrage aus, mit der ich alle Datensätze einer Tabelle bekomme, aber nur die letzten drei nicht?
wie dedlfix und rob bereits angemerkt haben, ist es zunächst ein Problem, die
drei "letzten" Datensätze zu erkennen.
Wie muss ich das schreiben? In Verbindung mit PHP und mehreren Abfragen könnte ich das zwar zusammenmurksen,
D.h. Du kennst das Kriterium, das Dir die letzten Datensätze liefern kann.
aber eigentlich sollte soetwas doch über MySQL auch gehen.
MySQL 4.1 und neuer vorausgesetzt, ja.
Gib mir die Liste der Datensätze, bei denen die Zeilenidentifizierer nicht
in der Liste der Zeilenidentifizierer der drei letzten Datensätze enthalten
sind:
[code lang=sql]SELECT -- Gib mir die Liste der
spaltenliste -- Datensätze
FROM tabelle t1 -- meiner Tabelle,
WHERE t1.id NOT IN ( -- deren Identifizierer nicht in der Liste
SELECT -- der Identifizierer
t2.id
FROM tabelle t2 --
ORDER BY dein_kriterium DESC
LIMIT 3 -- der drei "letzten" Datensätze
) -- enthalten ist.
Und die zweite Frage ist: Ich habe ein Feld von dem Typ ENUM. Wie kann ich mir alle Möglichkeiten, die ich bei ENUM angegeben habe, mir ausgeben lassen? Bei PhpMyAdmin wird das eingesetzt. Also muss es irgendwie gehen. Aber ich habe im Internet nichts dazu gefunden.
Das MySQL-Handbuch sagt es Dir im Abschnitt ENUM:
<zitat>
If you want to determine all possible values for an ENUM column, use SHOW COLUMNS FROM tbl_name LIKE enum_col and parse the ENUM definition in the Type column of the output.
</zitat>
Nein, das ist nicht besonders praktisch. Aber Du solltest an ENUM-Spalten
sowieso nicht herumhantieren.
Freundliche Grüße
Vinzenz
Hallo!
wie dedlfix und rob bereits angemerkt haben, ist es zunächst ein Problem, die
drei "letzten" Datensätze zu erkennen.
Das läuft über DATETIME.
aber eigentlich sollte soetwas doch über MySQL auch gehen.
MySQL 4.1 und neuer vorausgesetzt, ja.
Gut.
SELECT -- Gib mir die Liste der
spaltenliste -- Datensätze
FROM tabelle t1 -- meiner Tabelle,
WHERE t1.id NOT IN ( -- deren Identifizierer nicht in der Liste
SELECT -- der Identifizierer
t2.id
FROM tabelle t2 --
ORDER BY dein_kriterium DESC
LIMIT 3 -- der drei "letzten" Datensätze
) -- enthalten ist.
Da gibt es jetzt einen Fehler. "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'". Aber PhpMyAdmin sagt mir, dass ich "MySQL - 5.0.21-community-nt" habe. Das steht groß auf der Startseite. Komisch...
Das MySQL-Handbuch sagt es Dir im Abschnitt ENUM:
Da habe ich auch schon nachgeschaut, aber das habe ich dummerweise übersehen. Danke!
ciao, ww
Hallo,
SELECT -- Gib mir die Liste der
spaltenliste -- Datensätze
FROM tabelle t1 -- meiner Tabelle,
WHERE t1.id NOT IN ( -- deren Identifizierer nicht in der Liste
SELECT -- der Identifizierer
t2.id
FROM tabelle t2 --
ORDER BY dein_kriterium DESC
LIMIT 3 -- der drei "letzten" Datensätze
) -- enthalten ist.
tja, leider nicht so einfach, denn ...
Da gibt es jetzt einen Fehler. "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'". Aber PhpMyAdmin sagt mir, dass ich "MySQL - 5.0.21-community-nt" habe. Das steht groß auf der Startseite. Komisch...
... siehe http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html
Vielleicht geht es ja, wenn Du aus dem Subselect einen View machst :-)
Vielleicht solltest Du eher eine Stored Procedure nutzen.
Freundliche Grüße
Vinzenz
Hallo!
Vielleicht geht es ja, wenn Du aus dem Subselect einen View machst :-)
Vielleicht solltest Du eher eine Stored Procedure nutzen.
Ähm, das überfordert mich gerade ein wenig :) Ich löse das Problem jetzt erstmal mit PHP und werde diesen Thread mir aber für später vormerken. Wenn ich mal mehr Zeit habe, werde ich versuchen, die entsprechenden Kapitel im Manual auch noch zu lernen :-) Vielen Dank für deine Hilfe!
Jetzt probiere ich noch das mit ENUM :)
ciao, ww
Hallo!
Danke an alle, die mir geholfen haben! Jetzt klappt es :-)
ciao, ww
Danke an alle, die mir geholfen haben! Jetzt klappt es :-)
Nur mal interessehalber, habe nicht alles gelesen, wann macht man denn Abfragen, die "alle Datensätze holen, nur die letzten drei nicht"?
Hallo!
Nur mal interessehalber, habe nicht alles gelesen, wann macht man denn Abfragen, die "alle Datensätze holen, nur die letzten drei nicht"?
Wenn man eben alle Datensätze, außer den letzten drei darstellen will.
ciao, ww