Mailinglisten-Archive |
Manuel Hossfeld wrote: > (BTW: Wobei "SELECT id, version FROM doc GROUP BY id" zumindest bei MySQL > witzigerweise geht. Möchte mal wissen, nach welchen Kriterien er da die > Datensätze aus den Gruppen auswählt...) Nach gar keinen, MySQL wählt halt einen Eintrag aus der Gruppe aus. Da alle Elemente einer durch GROUP BY gebildeten Menge nach Definition gleich sind, kann jedes Element einer solchen Menge als Repräsentant dieser Menge ausgewählt werden. Gegeben sei eine Menge von Tupeln, etwa (1, 2), (1, 3), (2, 3), (2, 2), (3, 17), (2, 21). Man kann diese Menge jetzt in Teilmengen unterteilen, das wäre dann in der Mathematik eine Relation. Die Elemente, die gemeinsam in einer Teilmenge stehen, stehen dann "in einer Relation zueinander". Eine Relation ist zum Beispiel "kleiner als x". Nimmt man zum Beispiel die Menge |N und die Relation "kleiner als 10", dann teilt diese Relation die Menge |N in zwei Teilmengen, nämlich die Menge der natürlichen Zahlen, die die Relation erfüllen (also die Zahlen 1, 2, 3, ..., 9) und die Menge der natürlichen Zahlen, die die Relation nicht erfüllen (die Zahlen 10, ...). Ebenso kann man eine Äquivalenzrelation definieren. Eine solche Relation definiert mehrere Teilmengen und die Elemente einer Teilmenge sind gleich. In |N mit "==" als Relation ist das witzlos, da die Teilmengen dann einelementig sind, aber mit den o.a. Tupeln kann man ein sinnvolles Beispiel definieren, wenn man als Äquivalenzrelation "Gleichheit des ersten Elementes" definiert. Man bekommt dann die folgenden Teilmengen: Die Menge 1 == { (1, 2), (1, 3) } Die Menge 2 == { (2, 3), (2, 2), (2, 21) } Die Menge 3 == { (3, 17) } Angenommen, die Tupel seien eine Tabelle CREATE TABLE beispiel ( x integer, y integer ); dann würde man die o.a. Tupel als INSERT INTO beispiel (x, y) values (1, 2); INSERT INTO beispiel (x, y) values (1, 3); INSERT INTO beispiel (x, y) values (2, 3); INSERT INTO beispiel (x, y) values (2, 2); INSERT INTO beispiel (x, y) values (2, 21); INSERT INTO beispiel (x, y) values (3, 17); definieren und bekäme die Äquivalenzrelation aus dem Beispiel als SELECT x AS mengenname FROM beispiel GROUP BY x; +------------+ | mengenname | +------------+ | 1 | | 2 | | 3 | +------------+ 3 rows in set (0.01 sec) d.h. die Tupel (x, y) mit gleichem x bilden jeweils eine Menge. Wir sehen uns von diesen Tupeln jeweils nur die x an. Die Mächtigkeit der Mengen 1, 2 und 3 kann man mittels COUNT() bestimmen: SELECT x AS mengenname, COUNT(x) AS maechtigkeit FROM beispiel GROUP BY x; +------------+--------------+ | mengenname | maechtigkeit | +------------+--------------+ | 1 | 2 | | 2 | 3 | | 3 | 1 | +------------+--------------+ 3 rows in set (0.00 sec) Man kann sich auch das Tupel (x, y) wieder ausgeben lassen: SELECT x, y FROM beispiel GROUP BY x; +------+------+ | x | y | +------+------+ | 1 | 2 | | 2 | 3 | | 3 | 17 | +------+------+ 3 rows in set (0.00 sec) mysql wählt hier IRGENDEIN y, da ja per Definition alle (x, y) innerhalb einer Teilmenge gleich ist und jedes Element der Teilmenge daher als Repräsentant der Teilmenge gewählt werden kann. Siehe dazu auch http://www.amazon.de/exec/obidos/ASIN/3826603494/kristiankohntopp, Seite 261-294, speziell hier 287-288. Kristian -- Kristian Köhntopp, NetUSE Kommunikationstechnologie GmbH Siemenswall, D-24107 Kiel, Germany, +49 431 386 436 00 Using PHP3? See our web development library at http://phplib.shonline.de/ (GPL)
php::bar PHP Wiki - Listenarchive