Marc: mysql verschachtelte Abfrage funktioniert nicht richtig

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

  1. 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

    1. 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

      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...

      1. 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

        1. 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..

          1. 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

            1. SELECT * FROM preise WHERE preis<=80 AND wohnungsid=1 ORDER BY preis ASC LIMIT 1

              Gruß,
              Stevie B.

              1. 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

                1. 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.

                  1. 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

  2. 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?

  3. 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)

    1. 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