Halihallo lachesis
was ich möchte ist aber, dass eine pid nur ein mal vorkommt.
Also hab ich mir gedacht, dass das group by pid dies tun könnte.
Die Frage ist: Wenn du nach pid gruppierst, was soll dann mit den zusammengezogenen
Daten passieren? - Willst du pro pid das kleinste, das grösste oder die Summe der
Daten (letzteres, naja...). Wenn du GROUP BY benutzt, _musst_ du für jede _nicht_
Gruppierte Spalte sogenannte Agregatsfunktionen anwenden. Diese findest du in
http://www.mysql.com/doc/en/Group_by_functions.html, ansonsten weiss MySQL nicht,
was du denn überhaupt haben willst und fälschlicherweise liefert MySQL dann einfach
"irgendwas".
Folgendes Szenario:
Du hast eine Tabelle X:
id datum test
001 2003-05 hello world
002 2002-06 foo
003 2003-07 foo
001 2003-02 bar2
Nun führst du folgende Abfrage aus:
SELECT id, datum, test FROM X GROUP BY id
und kriegst:
id datum test
001 ??? ???
002 2002-06 foo
003 2003-07 foo
Jede id kommt aufgrund des GROUP BY id nur einmal vor. Bei id=002|003 ist auch das
ausgeben von datum und test "kein Problem", da die id nur einmal vorkommt, was aber bei
id=001? - id 001 kommt zweimal vor, es werden also zwei Datensätze zu einem zusammenge-
zogen. Was soll MySQL jetzt bitte schön deiner Meinung nach als datum oder test aus-
geben? - Wie soll es wissen, welches der beiden Daten und tests du nun möchtest?
Genau dieses Problem wird duch die Agregationsfunktionen gelöst; es ist dort möglich z.B.
das "maximale" (MAX(datum)) Datum aus den zwei zusammengezogenen Daten zu selektieren.
Du siehst es fehlt zB sonstiges...
GROUP BY pid führt dazu, dass alle Datensätze mit gleicher pid zusammengezogen werden.
Da du keine Agregatsfunktionen verwendest, weiss MySQL nicht, welches datum du aus
den zusammengezogenen Records extrahieren willst. Nimmt MySQL bei pid=5 (sonstiges) nun
ein ganz altes Datum (in deiner Datenbank kommt pid=5 nicht nur einmal vor, wie ich
folgere), fällt es aus den ersten 10 heraus (wird bei GROUP BY pid nicht mehr aus-
gegeben).
Das Datum zu Rechteck ist nicht das letzte...
s. oben. Woher soll MySQL wissen, welches Datum du willst? - Das erste (maximale)? -
Das letzte (kleinste, älteste)?
Sorry ich steh ziemlich aufm Schlauch
Kleiner Tipp: Datenbanken sind (multi-)mengenorientiert und es sind nach der 1NF keine
mehrwertigen Attribute erlaubt. Das Zusammenziehen von Records (GROUP BY) impliziert
dies jedoch (eine pid hat plötzlich mehrere Daten, wenn die pid mehrmals definiert ist).
Ausweg sind die genannten Agregatsfunktionen, andernfalls muss die DBMS raten, was
_immer_ schlecht ist (und meiner Meinung nach ein Bug im System ist).
Zuerst wird die Menge des Ergebnisses gebildet, dann wird Gruppiert, dann wird
Sortiert und am Schluss wird LIMIT ausgeführt. Die Datenbank sortiert völlig korrekt, nur
sortiert sie eine falsch abgebildete Menge (falsch, weil dessen Abbildungsvorschrift
nicht eindeutig war => bei GROUP BY keine Agregationsfunktionen).
So, das hätte ich mal wieder gesagt und ich hoffe, dass dir die "Phänomene" jetzt
logisch erklärbar sind...
Viele Grüsse und HTH
Philipp