PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Spalte aus Datenbank auslesen



Korrix
10-05-2006, 11:10
Hallo,

ich habe in meiner Datenbank eine Tabelle mit verschiedenen Produkten. Jedem Produkt ist ein Produkttyp zugeordnet, z.B.:


ID Prod. Produkttyp
01 Prod1 TypA
02 Prod2 TypA
03 Prod3 TypB


Ich möchte nun eine Abfrage mit PHP machen, die mir die verschiedenen Produkttypen ausliest und mir auflistet (ohne dass "TypA" zweimal auftaucht).

Das gewünschte Ergebnis soll also so aussehen:


TypA
TypB


Wie kann ich das realisieren?

Gaert
10-05-2006, 11:47
Hallo,

das scheint mir eigentlich ein Datenbank Problem und kein PHP Problem... sollte dem so sein verschiebe ich das Thema später ins Datenbank Forum.

Zu deiner Frage (ich nehme an du benutzt eine MySQL Datenbank):


SELECT Produkttyp FROM tabelle GROUP BY Produkttyp


Gruß,

Gaert

Korrix
10-05-2006, 12:04
Hey Gaert,

vielen Dank, genau das habe ich gesucht!

Tja, ich wusste nicht, ob ich die Abfrage mit PHP nachbearbeiten muss.

Gruß Korrix

Turbohummel
10-05-2006, 16:03
Hallo,

1. ich würde mir über das Datenbankdesign gedanken machen.

Eigentlich sollte es eine eigene Tabelle mit Produkttypen geben, die du über Fremdschlüssel mit der Artikeltabelle verbindest.

2.

SELECT DISTINCT produkttyp FROM tabelle;
ist die in diesem Falle sinnvollere Lösung, auch wenn das andere auch funzt.

Korrix
16-05-2006, 11:03
klar, aber die ganze Tabelle kommt aus einer Exceltabelle, die einfach importiert wird.

In diesem Fall missbrauche ich die Datenbank zur erweiterten Tabellenanzeige ;-)

elrond
22-05-2006, 09:41
Hallo,


SELECT DISTINCT produkttyp FROM tabelle;
ist die in diesem Falle sinnvollere Lösung, auch wenn das andere auch funzt.

aus welchem grund hälst du das für die bessere lösung?

mwanaheri
22-05-2006, 13:32
Na ja, syntaktisch ist "select distinct" schon glatter. Also aus Sicht der SQL-Syntax und für Wartbarkeit bei großen Sachen würde ich mich auch erst mal dafür entscheiden. Allerdings:

Ich habe beides mal an einer kurzen Tabelle getestet. Und bin erschrocken!

barrett=# explain analyze select distinct basisbefund from histotyp;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Unique (cost=70.69..75.38 rows=320 width=19) (actual time=12.836..16.953 rows=195 loops=1)
-> Sort (cost=70.69..73.03 rows=938 width=19) (actual time=12.832..13.050 rows=775 loops=1)
Sort Key: basisbefund
-> Seq Scan on histotyp (cost=0.00..24.38 rows=938 width=19) (actual time=0.013..1.157 rows=775 loops=1)
Total runtime: 17.155 ms
(5 Zeilen)


gegenüber


barrett=# explain analyze select basisbefund from histotyp group by basisbefund;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
HashAggregate (cost=26.73..26.73 rows=320 width=19) (actual time=5.010..5.195 rows=195 loops=1)
-> Seq Scan on histotyp (cost=0.00..24.38 rows=938 width=19) (actual time=0.009..0.683 rows=775 loops=1)
Total runtime: 5.309 ms
(3 Zeilen)


Das ist gerade mal 1/3 der Ausführungszeit!
Für mich heißt das: So eine Anfrage teste ich erst mal, bevor ich mich auf eins festlege. (Hier war es Postgres. Die Ergebnisse können stark schwanken je nach rdbms)

elrond
22-05-2006, 13:37
ich hab mal vor vielen jahren gelernt, dass distinct ein performancekiller ist. offensichtlich hat sich daran nix geändert. ...und schönheit des codes liegt doch immer im auge des betrachters... :rolleyes:

Turbohummel
22-05-2006, 17:33
Hallo,

also ich hab das daraufhin jetzt auch mal mit maxdb getestet. Ich konnte keinen Performanceunterschied zur Group-By-Variante feststellen, selbst bei 10000 Ergebniszeilen.