Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL Abfrage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    SQL Abfrage

    hi,

    ich bräuchte mal kurz ne hilfe bei einer SQL abfrage...
    bin da leider nicht ganz in schuss :/

    es geht um eine kleine autovermietung.

    ich will den höchsten bekannten wert aus 2 feldern meiner tabelle auslesen.
    problem ist: tacho_rueck kann NULL sein (sofern das auto noch ausgeliehen ist) und zusätzlich muss noch der höchste wert aller spalten wo das feld "pkw_kennzeichen" gleich ist zurückgegeben werden

    feld1: pkw_kennzeichen
    feld2: tacho_anfang
    feld3: tacho_rueck

    ich denke, man muss da erst mit zwei subselects die max werte für anfang und rueck bestimmen:
    select MAX(tacho_anfang) from leihe where leihe.pkw_kennzeichen=pkw.kennzeichen
    und
    select MAX(tacho_rueck) from leihe where leihe.pkw_kennzeichen=pkw.kennzeichen

    aber wie entscheide ich dann, welches größer ist?


    die ganze abfrage ist eine subselect von dieser bisherigen abfrage:
    "SELECT (SELECT COUNT(pkw_kennzeichen) from leihe where leihe.pkw_kennzeichen=pkw.kennzeichen) as count,
    hersteller.marke, modell.bezeichnung, pkw.kennzeichen, pkw.leistung, pkw.hubraum, pkw.datum_erstzulassung, **neue subselect hier**
    FROM pkw, hersteller, modell
    WHERE pkw.modell_id = modell.id
    AND modell.hersteller_id = hersteller.id order by count desc;";

    danke im vorraus :3

    #2
    Ich weiß, dass dieser Kommentar dir nicht unbedingt weiterhilft - aber warum arbeitest du nicht mit einer ORM?

    Genau aus solchen Gründen macht das Sinn, da braucht man keine ellenlangen, überkomplizierten, unflexiblen und obendrein Fehleranfälligen SQL Queries mehr bauen.

    Falls du unter PHP unterwegz bist kann ich dir zB Doctrine oder Propel ans Herz legen.

    Es ist ganz nice wenn man sich zB modular zur Laufzwit über PHP dynamisch DQL Queries zusammensetzen lassen kann die dann von Doctrine automatisch in valides SQL gewandelt (und nebenbei noch optimiert) werden

    Aus jahrelanger Erfahrung kann ich nur sagen
    Nie.wieder.ohne.

    --> http://www.doctrine-project.org/

    Und wenn du jetzt ganz geil bist setzt du das ganze in nem Framework ein, zB Symfony.

    Deine Projekte werden einfacher, schlanker, besser skalierbar und du hast automatisch eine MVC Architektur.

    Nur für die Zukunft so als Tip :)

    Kommentar


      #3
      Spoiler: 
      Zitat von Cpt. Obvious
      Ich weiß, dass dieser Kommentar dir nicht unbedingt weiterhilft - aber warum arbeitest du nicht mit einer ORM?

      Genau aus solchen Gründen macht das Sinn, da braucht man keine ellenlangen, überkomplizierten, unflexiblen und obendrein Fehleranfälligen SQL Queries mehr bauen.

      Falls du unter PHP unterwegz bist kann ich dir zB Doctrine oder Propel ans Herz legen.

      Es ist ganz nice wenn man sich zB modular zur Laufzwit über PHP dynamisch DQL Queries zusammensetzen lassen kann die dann von Doctrine automatisch in valides SQL gewandelt (und nebenbei noch optimiert) werden

      Aus jahrelanger Erfahrung kann ich nur sagen
      Nie.wieder.ohne.

      --> http://www.doctrine-project.org/

      Und wenn du jetzt ganz geil bist setzt du das ganze in nem Framework ein, zB Symfony.

      Deine Projekte werden einfacher, schlanker, besser skalierbar und du hast automatisch eine MVC Architektur.

      Nur für die Zukunft so als Tip :)


      Danke, aber es lohnt sich für mich jetzt nicht mehr. Außerdem muss ich das ganze schon Morgen abgeben :D


      Spoiler: 


      select MAX(
      CASE WHEN (
      select MAX(tacho_anfang) from leihe where leihe.pkw_kennzeichen='ST-FU-2010')
      >
      (select MAX(tacho_rueck) from leihe where leihe.pkw_kennzeichen='ST-FU-2010')

      THEN (select MAX(tacho_anfang) from leihe where leihe.pkw_kennzeichen='ST-FU-2010')

      ELSE (select MAX(tacho_rueck) from leihe where leihe.pkw_kennzeichen='ST-FU-2010')

      END) as tachostand from leihe


      ich dachte an sowas... aber klappt noch nicht ganz hrhr

      [image]http://img7.imagebanana.com/img/n59ou0ze/db.png[/image]



      Edit:
      okay, nun geht es. hatte max(tacho_anfang) > max(tacho_anfang) gerechnet ... :D

      Kommentar


        #4
        dscheiße, zu früh gefreut

        wenn ich die komplette select da als subselect einbauen will, gibt er mir folgenden fehler:

        "#1242 - Subquery returns more than 1 row"

        aber wenn ich die abfrage alleine ausführe bekomme ich nur 1 ergebnis?

        [image]http://img7.imagebanana.com/img/fbei51ht/db2.png[/image]

        komplette abfrage ist:

        Spoiler: 
        SELECT (SELECT COUNT(pkw_kennzeichen) from leihe where leihe.pkw_kennzeichen=pkw.kennzeichen) as count,
        hersteller.marke, modell.bezeichnung, pkw.kennzeichen, pkw.leistung, pkw.hubraum, pkw.datum_erstzulassung,
        (select MAX(CASE WHEN (select MAX(tacho_anfang) from leihe where leihe.pkw_kennzeichen=pkw.kennzeichen) >
        (select MAX(tacho_rueck) from leihe where leihe.pkw_kennzeichen=pkw.kennzeichen) THEN (select MAX(tacho_anfang) from leihe where leihe.pkw_kennzeichen=pkw.kennzeichen) ELSE (select MAX(tacho_rueck) from leihe where leihe.pkw_kennzeichen=pkw.kennzeichen) END) as tachostand from leihe)
        FROM pkw, hersteller, modell
        WHERE pkw.modell_id = modell.id
        AND modell.hersteller_id = hersteller.id order by count desc;


        weiß einer rat?

        Kommentar


          #5
          Du willst ja auch, dass nur 1 Ergebnis zurück kommt, oder? Das könnte man vlt noch mit LIMIT 1 im Subselect ausbauen, dann könnte SQL das fressen

          Kommentar


            #6
            Zitat von Cpt. Obvious
            Du willst ja auch, dass nur 1 Ergebnis zurück kommt, oder? Das könnte man vlt noch mit LIMIT 1 im Subselect ausbauen, dann könnte SQL das fressen
            Ja, es soll ein Ergebnis zurückkommen.
            Ich probier das mit LIMIT 1 mal und editier gleich oder so


            edit:
            also die komplette abfrage klappt mit dem LIMIT 1, ABER jetzt bekomme ich nur 1 auto ausgegeben (will ja alle anzeigen). Das mit "ein Ergebnis zurückkommen" sollte sich auf Tachostand beziehen :/


            edit2:
            nvm habs anders gelöst

            Kommentar


              #7
              kuckst du http://=http://www.sql-und-xml.de/sq...elzeilen.html]

              Kommentar


                #8
                € ups, verlesen. ich guck gleich nochmal drüber. sorry.

                ich verstehe deinen Plan nicht ganz, was willst du denn für eine Ausgabe haben? Den Datensatz mit dem höchsten Wert in tacho_anfang und tacho_rueck? Dann mach das doch einfach mit 2 selects, einmal mit max(tacho_anfang) und max(tacho_rueck). fertig?

                €2: hab grad deine Anweisung mal angeschaut und kann nicht ganz nachvollziehen was du machst.

                €3: dein nvm gelesen. Allet klar.

                Kommentar


                  #9
                  Zitat von juv
                  Zitat von Cpt. Obvious
                  Du willst ja auch, dass nur 1 Ergebnis zurück kommt, oder? Das könnte man vlt noch mit LIMIT 1 im Subselect ausbauen, dann könnte SQL das fressen
                  Ja, es soll ein Ergebnis zurückkommen.
                  Ich probier das mit LIMIT 1 mal und editier gleich oder so


                  edit:
                  also die komplette abfrage klappt mit dem LIMIT 1, ABER jetzt bekomme ich nur 1 auto ausgegeben (will ja alle anzeigen). Das mit "ein Ergebnis zurückkommen" sollte sich auf Tachostand beziehen :/


                  edit2:
                  nvm habs anders gelöst
                  Bei "multiple row subquerys" also subquerys, die mehr als eine Zeile zurückliefern, solltest du auch einen multiple row operator also z.B. >ALL, >ANY oder IN verwenden.

                  Kommentar


                    #10
                    ohne irgendwas gelesen zu haben:

                    SELECT * FROM users WHERE name = ' or '1'='1

                    Kommentar


                      #11
                      -> Problemecke

                      Kommentar


                        #12
                        Ohne die Datenbank zu kennen keine Chance deine Textwand zu verstehen...

                        Kommentar

                        Lädt...
                        X