mysql verschachtelte Abfrage funktioniert nicht richtig
Marc
- datenbank
Folgende Tabelle (preise):
preisid | wohnungsid | preis
--------|------------|------
1 |1 | 50
2 |1 | 56
3 |1 | 34
4 |1 | 345
Jetzt habe ich diese Abfrage:
SELECT * FROM preise WHERE 80 >= (SELECT max(preis) from preise where wohnungsid = 1) AND wohnungsid = 1
Die Abfrage soll alle Zeilen finden, wo der Preis <= 80 ist UND die wohungsid = 1 ist.
Es scheint zwar alles sowiet richtig zu sein, allerdings bekomme ich auch nicht die Zeilen außer der mit den 345 im preis, so wie ich mir das vorstelle
yo,
Die Abfrage soll alle Zeilen finden, wo der Preis <= 80 ist UND die wohungsid = 1 ist.
select preisid, wohungsid, preis
from presie
where preis <= 80 and wohungsid = 1
ilja
yo,
Die Abfrage soll alle Zeilen finden, wo der Preis <= 80 ist UND die wohungsid = 1 ist.
select preisid, wohungsid, preis
from presie
where preis <= 80 and wohungsid = 1ilja
Nee, das geht leider nicht, denn es soll nur der niedrigste Preis berücksichtigt werden.
Da war ein Fehlerteufel bei mir am Werk, ich meinte:
SELECT *
FROM preise
WHERE 80 >= (
SELECT MIN( preis )
FROM preise
WHERE wohnungsid =1 )
AND wohnungsid =1
Klappt aber trotzdem nicht...
yo,
Nee, das geht leider nicht, denn es soll nur der niedrigste Preis berücksichtigt werden.
aha, eine zusätzliche bedingung. ich gehe mal stillschweigend davon aus, dass deine mysql version unterabfragen kann.
select spalten...
from preise
where wohnungsid =1
and wohnungsid =1
and preis = (select min(preis) from preise where WHERE wohnungsid =1 AND wohnungsid =1)
ilja
yo,
Nee, das geht leider nicht, denn es soll nur der niedrigste Preis berücksichtigt werden.
aha, eine zusätzliche bedingung. ich gehe mal stillschweigend davon aus, dass deine mysql version unterabfragen kann.
select spalten...
from preise
where wohnungsid =1
and wohnungsid =1
and preis = (select min(preis) from preise where WHERE wohnungsid =1 AND wohnungsid =1)ilja
Ja, das scheint zu klappen...
Vielleicht bin ich auch völlig auf dem Holzweg. Nur zum Verständnis, ich möchte:
Die komplette Zeile mit dem billigsten Preis aller Zeilen mit der selben wohnungsid, auch wenn es mehrere "billigste" wohnungen gibt..
yo,
ich habe in den abfragen einmal zuviel wohnungsid =1 geschrieben, da sollte natürlich der preis <= 80 hin. und in der unterabfrage kann man es setzen oder weglassen, ist das gleiche.
select spalten...
from preise
where wohnungsid =1
and preis <= 80
and preis = (select min(preis) from preise where WHERE wohnungsid =1)
Die komplette Zeile mit dem billigsten Preis aller Zeilen mit der selben wohnungsid, auch wenn es mehrere "billigste" wohnungen gibt..
bezogen auf wohnungsid=1 und preis <= 80 macht die abfrage das. willst du das etwa auch für alle wohnungsid's insgesamt ?
ilja
SELECT * FROM preise WHERE preis<=80 AND wohnungsid=1 ORDER BY preis ASC LIMIT 1
Gruß,
Stevie B.
yo,
SELECT * FROM preise WHERE preis<=80 AND wohnungsid=1 ORDER BY preis ASC LIMIT 1
auf den ersten blick eine elegante lösung. das LIMIT ist eine feine sache. allerdings hat sie einen nachteil. bei mehreren datensätzen mit gleichen wert als minimum untergräbst du damit datensätze, die er glaube ich auch haben will.
Ilja
dann muß noch ein weiteres kriterium her, welches die datensätze mit gleichem preis unterscheidet. wie wärs mit preisid?
limit schein dann doch eher unangebracht zu sein. hier wäre die kombination von min(preis) und group(preisid) angebrachter.
dann sollte er alle sätze bekommen.
wenn er aber nur den kleinsten preis haben will, macht die beschränkung auf 80 wenig sinn. die einzige aussage hierbei wäre, ob überhaupt ein preis bis 80 vorhanden ist.
der kleinste preis scheint mir nur über einen self-join der tabelle möglich, wobei als verknüpfungskriterium min(preis) zu benutzen ist, falls es zulässig ist, oder man behilft sich mit einer having min(preis) klausel. groupen muss ja eh, da preisid als unterscheidungsmerkmal.
yo,
dann muß noch ein weiteres kriterium her, welches die datensätze mit gleichem preis unterscheidet. wie wärs mit preisid?
nicht unbedinkt. die unterabfrage macht eigentlich genau das, nachdem er gefragt hat.
limit schein dann doch eher unangebracht zu sein. hier wäre die kombination von min(preis) und group(preisid) angebrachter.
dann sollte er alle sätze bekommen.
wie gesagt, durch die unterabfrage bekommt er alle gewünschten datensätze. und group by (preisid) hat den nachteil, dass er sich nicht alle spalten ausgeben lassen kann.
wenn er aber nur den kleinsten preis haben will, macht die beschränkung auf 80 wenig sinn. die einzige aussage hierbei wäre, ob überhaupt ein preis bis 80 vorhanden ist.
ich bin mir aber auch nicht ganz sicher, was er haben will. er hat da eine lösung für sich gepostet, die mit ziemlicher sicherheit bei anderen dateninhalten nicht funktionieren wird. allerdings meldet er sich auch nicht mehr....
der kleinste preis scheint mir nur über einen self-join der tabelle möglich, wobei als verknüpfungskriterium min(preis) zu benutzen ist, falls es zulässig ist, oder man behilft sich mit einer having min(preis) klausel. groupen muss ja eh, da preisid als unterscheidungsmerkmal.
nein, wie gesagt, die unterabfrage sollte funktionieren. diese ermittelt den kleinsten wert. ich würde diese lösung gegenüber einen self-join vorziehen.
Ilja
SELECT * FROM preise WHERE 80 >= (SELECT max(preis) from preise where wohnungsid = 1) AND wohnungsid = 1
SELECT max(preis) from preise where wohnungsid = 1
ergibt 345
also
SELECT * FROM preise WHERE 80 >= (345) AND wohnungsid = 1
Wieso bekommst du überhaupt eine Zeile?
Ich Nase hab es raus - GROUP BY heißt das Zauberwort:
select * from preise where preisid = (select preisid from preise where wohnungsid = 1 and preis <= 80 group by preis)
yo,
Ich Nase hab es raus - GROUP BY heißt das Zauberwort:
select * from preise where preisid = (select preisid from preise where wohnungsid = 1 and preis <= 80 group by preis)
ich habe da meine starken zweifel, inhaltlich aber auch syntakisch.
ilja