PHP+MYSQL: Geht das einfacher?

PHP+MYSQL: Geht das einfacher?

am 03.11.2005 15:42:10 von Hendrik Vitte

Moin zusammen.

Ich habe eine Tabelle die eine Spalte "Kategorie" hat. Dort sind bunt
durcheinander gewuerfelt Eintraege enthalten. Nun moechte ich eine
Uebersicht haben, was fuer Kategorien ueberhaupt vorhanden sind.
Ich mache das im Moment so :

--- snip ---
//zur db connecten
$query = "SELECT kategorie FROM $db_tab GROUP BY kategorie";
$result = mysql_query($query) or die("could not fetch data from database");
// disconnecten
$a = array ();
$i = 0;
$temp = "";
while ($row = mysql_fetch_assoc($result)) {
if ($row['kategorie'] != $temp) {
$a[$i] = $row['kategorie'];
$i ++;
$temp = $row['kategorie'];
}
}
//$result freigeben
--- snip ---

Geht das irgendwie performater? Bestimmt, oder?

Liebe Gruesse
Hendrik

Re: PHP+MYSQL: Geht das einfacher?

am 03.11.2005 16:02:04 von Tobias Kutzler

Hendrik Vitte schrieb:
> Moin zusammen.
>
> Ich habe eine Tabelle die eine Spalte "Kategorie" hat. Dort sind bunt
> durcheinander gewuerfelt Eintraege enthalten. Nun moechte ich eine
> Uebersicht haben, was fuer Kategorien ueberhaupt vorhanden sind.
> Ich mache das im Moment so :
>
> --- snip ---
> //zur db connecten
> $query = "SELECT kategorie FROM $db_tab GROUP BY kategorie";

Probier mal $query = "SELECT DISTINCT kategorie FROM $db_tab";
Dann kannst Du nämlich ...

> $result = mysql_query($query) or die("could not fetch data from database");
> // disconnecten
> $a = array ();
> $i = 0;
> $temp = "";
> while ($row = mysql_fetch_assoc($result)) {
> if ($row['kategorie'] != $temp) {
> $a[$i] = $row['kategorie'];
> $i ++;
> $temp = $row['kategorie'];

.... das hier weglassen und stattdessen folgendes machen:
$a[] = $row['kategorie'];

> }
> }
> //$result freigeben
> --- snip ---

Allgemein: Das $i kannst Du auch weglassen. Bei numerisch indizierten
Arrays kann mittels [] ein neuer Index/Eintrag angelegt werden. Da
brauchst Du das $i nicht mit hochzählen.

Die von mir vorgeschlagene Vorgehensweise hat den Vorteil, dass nur die
Daten aus der Datenbank geholt werden, die Dich interessieren während
bei Deinem Vorschlag ersteinmal alle Datensätze aus der Datenbank geholt
werden und dann mittels PHP selektiert wird, was immer (!) schlechter in
der Performanz ist.

Ciao,
Tobias

Re: PHP+MYSQL: Geht das einfacher?

am 03.11.2005 16:34:08 von Niels Braczek

Hendrik Vitte schrieb:

> Ich habe eine Tabelle die eine Spalte "Kategorie" hat. Dort sind bunt
> durcheinander gewuerfelt Eintraege enthalten. Nun moechte ich eine
> Uebersicht haben, was fuer Kategorien ueberhaupt vorhanden sind.

Zusätzlich zu dem, was Tobias gesagt hat:
Dein Datenbankdesign ist kaputt[tm], wenn sich dieses Problem überhaupt
stellt.
Siehe http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´

Re: PHP+MYSQL: Geht das einfacher?

am 03.11.2005 16:56:57 von Tobias Kutzler

Niels Braczek schrieb:
> Hendrik Vitte schrieb:
>
>
>>Ich habe eine Tabelle die eine Spalte "Kategorie" hat. Dort sind bunt
>>durcheinander gewuerfelt Eintraege enthalten. Nun moechte ich eine
>>Uebersicht haben, was fuer Kategorien ueberhaupt vorhanden sind.
>
>
> Zusätzlich zu dem, was Tobias gesagt hat:
> Dein Datenbankdesign ist kaputt[tm], wenn sich dieses Problem überhaupt
> stellt.
> Siehe http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29

Naja, es könnte aber auch sein, dass ich meine Datenbank normalisiert
habe und dementsprechend mit Hilfe von Fremdschlüsseln auf andere
Tabellen verweise. Wenn ich nun wissen möchte, welche der existierenden
Primärschlüssel tatsächlich in meiner Tabelle als Fremdschlüssel genutzt
werden, stellt sich dieses Problem dann doch wieder ;-)

Anwendungsfall:
- Liste von Wohnungen (PK: eindeutige ID einer Wohnung)
- wer wohnt in welcher Wohnung? Tabelle mit Bewohnern und Fremdschlüssel
auf Wohnungstabelle

Problem: Ich möchte nun wissen, welche Wohnungen bewohnt sind oder nicht.

Ciao,
Tobias

Re: PHP+MYSQL: Geht das einfacher?

am 03.11.2005 17:16:29 von Niels Braczek

Tobias Kutzler schrieb:
> Niels Braczek schrieb:
>>
>> Siehe http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29
>
> Naja, es könnte aber auch sein, dass ich meine Datenbank normalisiert
> habe und dementsprechend mit Hilfe von Fremdschlüsseln auf andere
> Tabellen verweise. Wenn ich nun wissen möchte, welche der existierenden
> Primärschlüssel tatsächlich in meiner Tabelle als Fremdschlüssel genutzt
> werden, stellt sich dieses Problem dann doch wieder ;-)
>
> Anwendungsfall:
> - Liste von Wohnungen (PK: eindeutige ID einer Wohnung)
> - wer wohnt in welcher Wohnung? Tabelle mit Bewohnern und Fremdschlüssel
> auf Wohnungstabelle
>
> Problem: Ich möchte nun wissen, welche Wohnungen bewohnt sind oder nicht.

Dann holst du schlicht alle Wohnungen, in denen der Mieter-Schlüssel
null (unbewohnt) oder nicht null (bewohnt) ist.
DISTINCT ist immer ein Hinweis darauf, dass etwas suboptimal ist.

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´

Re: PHP+MYSQL: Geht das einfacher?

am 03.11.2005 17:25:23 von Hartmut Holzgraefe

Tobias Kutzler wrote:
> Hendrik Vitte schrieb:
>> $query =3D "SELECT kategorie FROM $db_tab GROUP BY kategorie";
>=20
> Probier mal $query =3D "SELECT DISTINCT kategorie FROM $db_tab";
> Dann kannst Du nämlich ...

das Ergebnis sollte für beide Abfragen gleich aussehen,
ich verstehe daher nicht warum sich der Auswertungscode
dahinter durch diese Änderung vereinfachen sollte?

--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

Re: PHP+MYSQL: Geht das einfacher?

am 03.11.2005 18:31:58 von Clemens Ebinger

>suboptimal
unwort des jahres?

Re: PHP+MYSQL: Geht das einfacher?

am 03.11.2005 20:04:42 von Tobias Kutzler

Niels Braczek schrieb:
> Tobias Kutzler schrieb:
>
>>Niels Braczek schrieb:
>>
>>>Siehe http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29
>>
>>Naja, es könnte aber auch sein, dass ich meine Datenbank normalisiert
>>habe und dementsprechend mit Hilfe von Fremdschlüsseln auf andere
>>Tabellen verweise. Wenn ich nun wissen möchte, welche der existierenden
>>Primärschlüssel tatsächlich in meiner Tabelle als Fremdschlüssel genutzt
>>werden, stellt sich dieses Problem dann doch wieder ;-)
>>
>>Anwendungsfall:
>>- Liste von Wohnungen (PK: eindeutige ID einer Wohnung)
>>- wer wohnt in welcher Wohnung? Tabelle mit Bewohnern und Fremdschlüssel
>>auf Wohnungstabelle
>>
>>Problem: Ich möchte nun wissen, welche Wohnungen bewohnt sind oder nicht.
>
>
> Dann holst du schlicht alle Wohnungen, in denen der Mieter-Schlüssel
> null (unbewohnt) oder nicht null (bewohnt) ist.
> DISTINCT ist immer ein Hinweis darauf, dass etwas suboptimal ist.

Ich glaube, dass Du mein Bsp. nicht richtig verstanden hast.

Tabelle Wohnungen
Spalten: ID, Adresse, Ort

Tabelle Mieter
Spalten: ID, Name, Wohnung

Die Spalte Wohnung in der Tabelle Mieter ist ein Fremdschlüssel auf die
ID von Wohnungen. Wenn ich nun die IDs aller Wohnungen haben möchte, die
bewohnt sind, dann lasse ich mittels SELECT DISTINCT Wohnung FROM Mieter
alle IDs der Wohnungen ausgeben, die bewohnt sind.

Ich stimme Dir zu, dass DISTINCT nicht unbedingt eine gute Art ist, eine
Tabelle abzufragen, da sie im Endeffekt von vorn bis hinten sequentiell
durchlaufen werden muss. Manchmal ist es aber eben so, dass man eine
Abfrage machen muss, die eben nicht anders geht, oder?! ;-)

Ciao,
Tobias

Re: PHP+MYSQL: Geht das einfacher?

am 03.11.2005 22:21:05 von Matthias Esken

On Thu, 03 Nov 2005 17:25:23 +0100, Hartmut Holzgraefe wrote:

> Tobias Kutzler wrote:
>> Hendrik Vitte schrieb:
>>> $query = "SELECT kategorie FROM $db_tab GROUP BY kategorie";
>>
>> Probier mal $query = "SELECT DISTINCT kategorie FROM $db_tab";
>> Dann kannst Du nämlich ...
>
> das Ergebnis sollte für beide Abfragen gleich aussehen,
> ich verstehe daher nicht warum sich der Auswertungscode
> dahinter durch diese Änderung vereinfachen sollte?

Hmmm, hab' ich da jetzt was übersehen? Im vorgestellten Code wird nämlich
noch einmal explizit auf Gleichheit der Daten geprüft. Das kann man sich
bei der Verwendung von DISTINCT nun wirklich sparen.

Gruß,
Matthias

Re: PHP+MYSQL: Geht das einfacher?

am 03.11.2005 23:05:49 von Niels Braczek

Tobias Kutzler schrieb:
> Niels Braczek schrieb:

>> DISTINCT ist immer ein Hinweis darauf, dass etwas suboptimal ist.
>
> Ich glaube, dass Du mein Bsp. nicht richtig verstanden hast.
>
> Tabelle Wohnungen
> Spalten: ID, Adresse, Ort
>
> Tabelle Mieter
> Spalten: ID, Name, Wohnung

Eine Wohnung hat *einen* Mieter, ein Mieter kann *verschiedene*
Wohnungen haben. Also wäre

Wohnungen: ID, Adresse, Ort, FK_Mieter
Mieter: ID, Name

sinnvoller.

"SELECT ID FROM Wohnungen WHERE FK_Mieter=null" liefert dir alle freien
Wohnungen, "SELECT ID FROM Wohnungen WHERE FK_Mieter<>null" alle
belegten. Ohne DISTINCT.

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´

Re: PHP+MYSQL: Geht das einfacher?

am 03.11.2005 23:44:09 von Tobias Kutzler

Niels Braczek schrieb:
> Tobias Kutzler schrieb:
>
>>Niels Braczek schrieb:
>
>
>>>DISTINCT ist immer ein Hinweis darauf, dass etwas suboptimal ist.
>>
>>Ich glaube, dass Du mein Bsp. nicht richtig verstanden hast.
>>
>>Tabelle Wohnungen
>>Spalten: ID, Adresse, Ort
>>
>>Tabelle Mieter
>>Spalten: ID, Name, Wohnung
>
>
> Eine Wohnung hat *einen* Mieter, ein Mieter kann *verschiedene*
> Wohnungen haben. Also wäre
>
> Wohnungen: ID, Adresse, Ort, FK_Mieter
> Mieter: ID, Name
>
> sinnvoller.
>
> "SELECT ID FROM Wohnungen WHERE FK_Mieter=null" liefert dir alle freien
> Wohnungen, "SELECT ID FROM Wohnungen WHERE FK_Mieter<>null" alle
> belegten. Ohne DISTINCT.
>

Okay, überzeugt. :-)

Ciao,
Tobias

Re: PHP+MYSQL: Geht das einfacher?

am 04.11.2005 01:40:54 von Hartmut Holzgraefe

Matthias Esken wrote:
> Hmmm, hab' ich da jetzt was übersehen? Im vorgestellten Code wird nä=
mlich
> noch einmal explizit auf Gleichheit der Daten geprüft. Das kann man s=
ich
> bei der Verwendung von DISTINCT nun wirklich sparen.

bei GROUP BY aber ebenso

--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

Re: PHP+MYSQL: Geht das einfacher?

am 04.11.2005 03:38:32 von Sevo Stille

Niels Braczek wrote:

> DISTINCT ist immer ein Hinweis darauf, dass etwas suboptimal ist.

DISTINCT über die gesamte Tabelle ja - wenn sich da Einträge fi=
ltern=20
lassen, stimmt die Normalisierung nicht.

Aber über einzelne Spalten brauchst du es immer, wenn du eine=20
qualitative Angabe der enthaltenen Werte statt der quantitativen willst. =

"SELECT DISTINCT zimmernummer FROM buchungen WHERE datum > x AND datum < =

y" gibt dir eine Liste der Zimmer, die in der gewählten Zeit belegt =
sind=20
- daß und wann Zimmer 302 im Zeitraum an drei Tagen belegt war, wird=
=20
den, der die belegten Zimmer für den Zeitraum (oder durch Exklusion =
die=20
freien) sucht, nicht interessieren.

Gruß Sevo

Re: PHP+MYSQL: Geht das einfacher?

am 04.11.2005 04:16:48 von Niels Braczek

Sevo Stille schrieb:
> Niels Braczek wrote:
>
>> DISTINCT ist immer ein Hinweis darauf, dass etwas suboptimal ist.
>
> DISTINCT über die gesamte Tabelle ja - wenn sich da Einträge filtern
> lassen, stimmt die Normalisierung nicht.
>
> Aber über einzelne Spalten brauchst du es immer, wenn du eine
> qualitative Angabe der enthaltenen Werte statt der quantitativen willst.
> "SELECT DISTINCT zimmernummer FROM buchungen WHERE datum > x AND datum <
> y" gibt dir eine Liste der Zimmer, die in der gewählten Zeit belegt sind
> - daß und wann Zimmer 302 im Zeitraum an drei Tagen belegt war, wird
> den, der die belegten Zimmer für den Zeitraum (oder durch Exklusion die
> freien) sucht, nicht interessieren.

Aufgrund dieses Aspektes sagte ich ja *Hinweis*. Dein Beispiel ließe
sich aber auch mit 'GROUP BY zimmernummer' lösen. Aber das ist jetzt 1)
Haarspalterei und 2) völlig OT.

MfG
Niels

--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · E-Commerce · Mambo Content Management |
`----------------------------------------------------------- -----´

Re: PHP+MYSQL: Geht das einfacher?

am 04.11.2005 13:55:29 von Hartmut Holzgraefe

Niels Braczek wrote:
> Aufgrund dieses Aspektes sagte ich ja *Hinweis*. Dein Beispiel ließe
> sich aber auch mit 'GROUP BY zimmernummer' lösen. Aber das ist jetzt =
1)
> Haarspalterei und 2) völlig OT.

und 3) vermutlich noch weniger optimal

--=20
Hartmut Holzgraefe, Senior Support Engineer .
MySQL AB, www.mysql.com

Re: PHP+MYSQL: Geht das einfacher?

am 04.11.2005 19:42:45 von Matthias Esken

On Fri, 04 Nov 2005 01:40:54 +0100, Hartmut Holzgraefe wrote:

> Matthias Esken wrote:
>> Hmmm, hab' ich da jetzt was übersehen? Im vorgestellten Code wird nämlich
>> noch einmal explizit auf Gleichheit der Daten geprüft. Das kann man sich
>> bei der Verwendung von DISTINCT nun wirklich sparen.
>
> bei GROUP BY aber ebenso

Argh, das ist mir durchgegangen.

Gruß,
Matthias