phpbar.de logo

Mailinglisten-Archive

[php] Re: [etwas OT] DB-Zeilen "filtern"

[php] Re: [etwas OT] DB-Zeilen "filtern"

Kristian =?iso-8859-1?Q?K=F6hntopp?= kk_(at)_netuse.de
Thu, 01 Jul 1999 17:25:34 +0200


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