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