Aktueller Field zeigen mit Group BY (mysql)
-
Hallo an Alle,
wenn ich schreibe:
select * from table group by documentname;
dann zeigt immer der erste Docoment und nicht der letzte eingefügte Document.
wie mache ich das?. Es geht auch nicht wenn ich 'order by datum' schreibe, er zeigt immer z.B 2 Documents die mit gleichen name sind, aber nur die erste und nicht die letzte (aktuelle).
danke sehr
c++_hoby
-
Wenn du nur das letzte brauchst darfts du nicht gruppieren.
ORDER BY Datum DESC LIMIT 1
reicht.
-
ich will aber die gesamte tablle zeigen
select count(*), id, documentname, datum, verion from table group by documentname;
wenn er mir folgendes zeigt:
------------------------
2 Document1 2004-05-30 a
3 Document2 2004-06-01 a
1 Document3 2004-06-15 a
------------------------
dann weiss ich dass Document 1 enthällt 2 Versionen aber er Zeigt nur die alte und nicht die aktuelle (anhand der Datum und andere Felder..) und das gleiche mit Document 3 ...
ich will das er folgendes zeigt:
------------------------
2 Document1 2004-06-03 b
3 Document2 2004-06-15 c
1 Document3 2004-06-15 a
------------------------
danke
c++_hoby
-
Nochmals. Wenn du GROUP BY verwendest bekommst du keinen einzelnen Datensatz sondern eine bestimmte Ergebnismenge aus der Ergebnismenge.
Heist soviel wie: Du bekommst eine Zusammenfassung aus vielen Datensätzen und keinen einzelnen Datensatz.Wenn der Count hier 2 anzeigt dann gibt es 2 Datensätze. Die Ergebnismenge hat aber nurmehr einen weil du gruppiert hast und somit werden die beiden in der Ergebnismenge zu einem Zusammengefasst.
-
Wie wärs mit?
SELECT id, documentname, max(datum), max(version) FROM table GROUP BY id, documentname;
-
Hi,
ich habe es mit dem
SELECT id, documentname, max(datum) AS datum, max(version) FROM table GROUP BY id, documentname;
ausprobiert hat leider nicht funkz., und Group By id hat die Groppierung wieder auseinander genommen.
es muss ein Weg geben um die Groppierung mit dem Aktuellen Fields zu zeigen und nicht die alten.
2 Document1 2004-06-03 a
3 Document2 2004-05-08 a
6 Document3 2004-04-04 a
erste Zeile sagt: hier gibt es 2 Documente die Document1 heißen aber er zeigt mir hier die alte Version (a) und nicht die aktuelle (d) mit dem Datum 2004-06-30 z.B.
die Idee mit dem MAX(Datum) war nicht schlecht.
danke
C++_Hoby
-
hi,
nun habe ich es noch einmal in den commandline direkt ohne php ausprobiert um erst ein gefühl zu bekommen:
mysql>select * from table;
+----------------------------------+
|id|documentname|version|date |
|1 |doc_1 |entwurf|2004-04-01|
|2 |doc_1 |- |2004-05-05|
|3 |doc_1 |A |2004-05-10|
|4 |doc_1 |B |2004-05-20|
|5 |doc_2 |- |2004-06-03|
|6 |doc_2 |A |2004-06-15|
+----------------------------------+
mysql>select count() as mal, documentname, verion, date from table;
+-----------------------------------+
|mal|documentname|version|date |
|4 |doc_1 |entwurf|2004-04-01|
|2 |doc_2 |A |2004-06-15|
+-----------------------------------+
mein problem ist: mysql gruppiert richtig aber zeigt die alte zeile von Doc_1 und Doc_2, dafür habe ich (von hier) die Idee mit dem max(..) wie:
mysql>select count() as mal, documentname, max(verion) as verion, max(date)as date from table;
+-----------------------------------+
|mal|documentname|version|date |
|4 |doc_1 |entwurf|2004-05-20|
|2 |doc_2 |A |2004-06-03|
+-----------------------------------+
wie es oben sieht es mit dem max(date) richtig aus, aber mit max(verion) nicht, "entwurf" ist nicht der aktuellste doc_1 sondern "B". ist klar es geht vielleicht mit dem Zahlen oder Buchstaben, aber nicht wenn man "entwurf" oder "vorabzug" schreibt, gibt es vielleicht ein Idee wie man in den select statment sagt: hole mir alles in dieser gruppe was mit max(date) zu tun hat?
danke
C++_hoby
-
entschuldigung, ich habe 'group by' in mein sql statment vergessen.
-
noch einmal richtig geschrieben, sorry heute ist nicht mein Tag:
ich habe es noch einmal in den commandline direkt ohne php ausprobiert um erst ein gefühl zu bekommen:
mysql>select * from table;
+----------------------------------+
|id|documentname|version|date |
|1 |doc_1 |entwurf|2004-04-01|
|2 |doc_1 |- |2004-05-05|
|3 |doc_1 |A |2004-05-10|
|4 |doc_1 |B |2004-05-20|
|5 |doc_2 |- |2004-06-03|
|6 |doc_2 |A |2004-06-15|
+----------------------------------+
mysql>select count() as mal, documentname, verion, date from table group by documentname;
+-----------------------------------+
|mal|documentname|version|date |
|4 |doc_1 |entwurf|2004-04-01|
|2 |doc_2 |A |2004-06-15|
+-----------------------------------+
mein problem ist: mysql gruppiert richtig aber zeigt die alte zeile von Doc_1 und Doc_2, dafür habe ich (von hier) die Idee mit dem max(..) wie:
mysql>select count() as mal, documentname, max(verion) as verion, max(date)as date from table group by documentname;
+-----------------------------------+
|mal|documentname|version|date |
|4 |doc_1 |entwurf|2004-05-20|
|2 |doc_2 |A |2004-06-03|
+-----------------------------------+
wie es oben sieht es mit dem max(date) richtig aus, aber mit max(verion) nicht, "entwurf" ist nicht der aktuellste doc_1 sondern "B". ist klar es geht vielleicht mit dem Zahlen oder Buchstaben, aber nicht wenn man "entwurf" oder "vorabzug" schreibt, gibt es vielleicht ein Idee wie man in den select statment sagt: hole mir alles in dieser gruppe was mit max(date) zu tun hat?
dann wäre das richtige Antwort wie:
+-----------------------------------+
|mal|documentname|version|date |
|4 |doc_1 |B|2004-05-20|
|2 |doc_2 |A |2004-06-03|
+-----------------------------------+
danke
C++_hoby
-
Vielleicht so?
select count(tab1.*) as mal, tab1.documentname, tab2.verion, max(tab1.date)as date from table AS tab1 INNER JOIN table AS tab2 USING(id) group by documentname;
(Nur mal so ne Idee)
-
Guten Abend,
ich habe das Problem mit primary table gelöst es geht so:sql>CREATE temporary table temp_tabel SELECT COUNT(documentname) AS mal, version, MAX(datum) AS datum FROM table GROUP BY documentname ORDER BY datum;
sql>SELECT temp_tabel.mal, table.documentname, table.datum FROM table, temp_tabel WHERE table.documentname=temp_tabel.documentname AND table.datum=temp_tabel.datum;
und schon bekommt man das richtige reihnfolge.
viele Grüße
C++_Hoby