SQL-Problem: Preiskategorien abfragen

SQL-Problem: Preiskategorien abfragen

am 10.12.2006 20:30:22 von francwalter

Hallo,
Ich habe eine Tabelle (tab) mit verschiedenen Preiskategorien, nämlich
verschiedene Preise,
abhängig von der Anzahl (nicht regelmässig), z.B.

1, 1, 1, 1.0 (Erklärung: 'ID' =3D 1, 'Preiskategorie' =3D 1, 'Anzahl'
=3D 1, 'Preis' =3D 1.0)
2, 1, 100, 0.9 (Erklärung: 'ID' =3D 2, 'Preiskategorie' =3D 1, 'Anzahl'
=3D 100, 'Preis' =3D 0.9)
3, 1, 1000, 0.8 (Erklärung: 'ID' =3D 3, 'Preiskategorie' =3D 1, 'Anzahl' =
=3D
1000, 'Preis' =3D 0.8)
4, 2, 1, 50.0 (Erklärung: 'ID' =3D 4, 'Preiskategorie' =3D 2, 'Anzahl' =
=3D
1, 'Preis' =3D 50.0)
5, 2, 1000, 49.0 (usw.)
6, 3, 1, 3.5
7, 3, 500, 3.4
usw.
Gibt es hier eine elegantere Lösung, um "zwischen"
zwei werte zu kommen (also z.B. Suche den Preis der Preiskategorie 1,
bei Anzahl =3D 37 in diesem Fall käme 1.0 raus, da unter 100)
ausser mit ORDER BY DESC und LIMIT
(also "SELECT Preis FROM tab WHERE Preiskategorie =3D 1 AND Anzahl < 37
ORDER BY Preis DESC LIMIT 1")
Oder ist da die Tabelle schon ungeschickt angelegt?
Danke für Tips,
Gruss franc

Re: SQL-Problem: Preiskategorien abfragen

am 10.12.2006 22:47:51 von Helmut Chang

francwalter@gmx.de schrieb:
> Hallo,
> Ich habe eine Tabelle (tab) mit verschiedenen Preiskategorien, nämlich
> verschiedene Preise,
> abhängig von der Anzahl (nicht regelmässig),...

Also Staffelpreise.

> Gibt es hier eine elegantere Lösung, um "zwischen"
> zwei werte zu kommen (also z.B. Suche den Preis der Preiskategorie 1,
> bei Anzahl = 37 in diesem Fall käme 1.0 raus, da unter 100)
> ausser mit ORDER BY DESC und LIMIT
> (also "SELECT Preis FROM tab WHERE Preiskategorie = 1 AND Anzahl < 37
> ORDER BY Preis DESC LIMIT 1")
^^^^

Hmm... Willst du nicht den kleinsten Preis haben, der bei den
Datensätzen, die die 'WHERE Anzahl'-Bedingung erfüllen, zurückgegeben
wird? Bzw. wirklich korrekt wäre wohl 'ORDER BY Anzahl DESC'.

Ansonsten, wenn sicher gestellt ist: höhere Staffel-Anzahl = niedrigerer
Preis ginge auch:

SELECT MIN(Preis)
FROM tab
WHERE Preiskatgeorie = 1
AND Anzahl < 37
(GROUP BY Preiskategorie)

gruss, heli

Re: SQL-Problem: Preiskategorien abfragen

am 10.12.2006 23:39:49 von francwalter

Danke, Heli.
Ja Du hast natürlich recht, ich muss nach Anzahl sortieren
(rückwärts), weil die ja die eigentliche Staffel ausmacht.
Gibts denn für solche Staffelpreis-Tabellen geschicktere Ansätze,
oder ist eine solche Tabelle üblich?
Gruss franc

Re: SQL-Problem: Preiskategorien abfragen

am 11.12.2006 18:53:07 von Helmut Chang

francwalter@gmx.de schrieb:

> Ja Du hast natürlich recht, ich muss nach Anzahl sortieren
> (rückwärts), weil die ja die eigentliche Staffel ausmacht.

Dann sollte es doch so passen. Andere Möglichkeit:

In Prosa:

Hole den Datensatz mit der größten Staffelmenge, die kleiner als die
tatsächliche Anzahl ist, aus der gesuchten Kategorie.

In SQL (mit hinreichend neuem SQL und ungetestet):

SELECT Preis
FROM Tabelle
WHERE Preiskategorie = x
AND Anzahl = (
SELECT MAX(Anzahl)
FROM Tabelle
WHERE Preiskategotegorie = x
AND Anzahl < y
)

Siehe auch



Ob das effizienter ist, weiß ich allerdings nicht.

> Gibts denn für solche Staffelpreis-Tabellen geschicktere Ansätze,...

Mir fällt grad nix dazu ein. Tät ich genauso machen.

gruss, heli

Re: SQL-Problem: Preiskategorien abfragen

am 11.12.2006 20:48:59 von francwalter

> SELECT Preis
> FROM Tabelle
> WHERE Preiskategorie = x
> AND Anzahl = (
> SELECT MAX(Anzahl)
> FROM Tabelle
> WHERE Preiskategotegorie = x
> AND Anzahl < y
> )

Doppel-Super-Heli,
Danke,
franc

Re: SQL-Problem: Preiskategorien abfragen

am 11.12.2006 20:55:41 von francwalter

... fällt mir allerdings gerade auf, dass der (alte) mysql server (vs.
40.27) ja gar kein subselect kann. sowas.
also auf jeden fall mit limit... :-)