SELECT Problem mit statistischer Abfrage
am 19.11.2006 12:12:05 von Martin Nadoll
Hallo,
ich habe eine MySQL Tabelle mit Artikeln.
Jeder Artikel hat einen oder mehrere (im Grunde beliebig viele) Preise,
die in einem VARCHAR als kommaseparierte Liste gespeichert sind.
Z.B.
Artikel 1 Preis: "17.90, 15.90,13.90, 11.90"
Artikel 2 Preis: "99" usw.
Leider verlangt der Aufbau der Anwendung nach dieser Konstruktion.
Ein Problem ergibt sich für mich durch die Aufgabe, die Artikel für eine
Artikelstatistik
nach Preis sortiert absteigend aufzulisten.
Problem 1:
Da ich ein VARCHAR habe, wird 7.90 als größer angesehen als 59.90.
Problem 2:
Die Abfrage sollte möglichst nur den Wert vor dem ersten Komma (wenn es eins
gibt) berücksichtigen.
Leider habe ich keine Idee, wie diese SQL-Abfrage auszusehen hat.
Wenn mir jemand helfen kann, wäre ich sehr dankbar.
Martin Nadoll
Re: SELECT Problem mit statistischer Abfrage
am 19.11.2006 13:57:03 von Thomas Rachel
Martin Nadoll wrote:
> Jeder Artikel hat einen oder mehrere (im Grunde beliebig viele) Preise,
> die in einem VARCHAR als kommaseparierte Liste gespeichert sind.
> Z.B.
> Artikel 1 Preis: "17.90, 15.90,13.90, 11.90"
> Artikel 2 Preis: "99" usw.
> Leider verlangt der Aufbau der Anwendung nach dieser Konstruktion.
Das glaube ich erstmal nicht - mit einem geeigneten Query bekommt die
Anwendung genau das Format, das sie braucht, auch wenn die Daten
normalisiert abgespeichert sind.
> Ein Problem ergibt sich für mich durch die Aufgabe, die Artikel für
> eine Artikelstatistik
> nach Preis sortiert absteigend aufzulisten.
> Problem 1:
> Da ich ein VARCHAR habe, wird 7.90 als größer angesehen als 59.90.
Eben - das hättest Du anders nicht.
Was Du hier allenfalls tun könntest, wäre, unter Berücksichtigung von
> Problem 2:
> Die Abfrage sollte möglichst nur den Wert vor dem ersten Komma (wenn
> es eins gibt) berücksichtigen.
den String so aufzusplitten, daà Du genau den ersten Preis bekommst, und
den dann in eine Zahl zu wandeln. So etwa:
create temporary table t (s varchar(100));
insert into t values ('3.50,4.80,12.40'),('2.20,12.30');
insert into t values ('13.50,4.80,12.40'),('15.20,12.30');
insert into t values ('132.50'),('152.20');
select s,substring(s,1,ifnull(nullif(position(',' IN
s),0)-1,length(s)))+0 as ersterWert from t order by 2;
+------------------+------------+
| s | ersterWert |
+------------------+------------+
| 2.20,12.30 | 2.2 |
| 3.50,4.80,12.40 | 3.5 |
| 13.50,4.80,12.40 | 13.5 |
| 15.20,12.30 | 15.2 |
| 132.50 | 132.5 |
| 152.20 | 152.2 |
+------------------+------------+
Was passiert da? Nun, position kann 0 zurückgeben. Das ist ein Sonderfall
- dann soll nämlich ger gesamte String zurückgegeben werden. Das wird
mit der ifnull/nullif-Kaskade behandelt. Wenn != 0 zurückgegeben wird,
ist das die Position des ersten Kommas. Diese -1 ergibt die Länge des zu
verwendenden Teilstrings.
Die so ermittelte Länge wird an substring übergeben, dessen Ergebnis dann
mit 0 addiert wird, also in einen Zahlenwert gewandelt wird. (Das ginge
sicherlich auch mit irgendeinem Cast-Befehl.)
Statt mit ifnull/nullif könnte man auch mit CASE arbeiten, dann müÃte
jedoch position() mehrfach aufgerufen werden.
HTH,
Thomas
--
Jabber-ID: glglgl@amessage.info (keine Email-Adresse!)
Warum Jabber, was ist das und wie geht das?
http://de.wikibooks.org/wiki/Jabber-Kompendium:_Schnelleinst ieg
Re: SELECT Problem mit statistischer Abfrage
am 19.11.2006 20:16:22 von Claus Reibenstein
Martin Nadoll schrieb:
> ich habe eine MySQL Tabelle mit Artikeln.
> Jeder Artikel hat einen oder mehrere (im Grunde beliebig viele) Preise,
> die in einem VARCHAR als kommaseparierte Liste gespeichert sind.
Wer hat sich denn diesen Unsinn ausgedacht? Offenbar jemand, der von
Datenbanken _keine_ Ahnung hat.
> Z.B.
> Artikel 1 Preis: "17.90, 15.90,13.90, 11.90"
> Artikel 2 Preis: "99" usw.
Das ist krank. Schlicht krank
> Leider verlangt der Aufbau der Anwendung nach dieser Konstruktion.
Das kommt davon, wenn man irgendwelche Hanseln an solche Aufgaben
dranlässt (Geiz ist geil?), anstatt gleich einen Profi damit zu
beauftragen (Geist ist geil!).
> Ein Problem ergibt sich für mich durch die Aufgabe, die Artikel für eine
> Artikelstatistik
> nach Preis sortiert absteigend aufzulisten.
Verzeihung, aber es ist schlicht Schwachsinn, so etwas auch nur zu
versuchen. Das Design ist kaputt. Darin liegt die Ursache, und die muss
beseitigt werden. Alles andere ist unsinniges Rumwerkeln an
irgendwelchen Symptomen und wird Dich langfristig nicht glücklich
machen. Selbst wenn Du dieses Problem irgendwann mit unverhältnismäÃig
hohem Aufwand gelöst bekommen haben solltest, wirst Du bald mit dem
nächsten Problem konfrontiert werden, was wiederum einen
unverhältnismäÃigen Aufwand zur Lösung erfordert etc. - eine Spirale
ohne Ende.
GruÃ. Claus
--
,~°O O
O ,´ / |/|\
/ |¯`. Das neue Hochzeits-Branchenbuch im Internet ,´ / | |\
/__| `~...............................................~´ /___|/ /