SQL Abfrage nochmal (aus)sortieren

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

  • SQL Abfrage nochmal (aus)sortieren

    Hallo zusammen,

    trotz Forensuche etc. kam ich auf keine Lösung bei folgendem Problem:

    Also eine recht komplexe Datenbankabfrage:

    PHP-Code:
    SELECT u.u_iduz.uz_id, IF(u.u_waehrung != 11.00 uw.uw_umrechnung,1) * 
    ((
    uz.uz_stpreis * (ABSTO_DAYS'2006-09-04' ) - TO_DAYS'2006-08-30' )) - 
    COUNTuze.uze_uzid )) + 
    SUMuze.uze_preis )) * IF(u.u_kostenberechnung='Person',5,1)) 
    AS 
    gesamtpreis
    COUNT(uzs.uzs_id) AS verfuegbar 
    FROM unterkunft 
    AS 
    LEFT JOIN verband 
    AS v ON v.v_id u.u_vid 
    LEFT JOIN u_zimmer 
    AS uz ON uz.uz_uid u.u_id 
    LEFT JOIN uz_expreise 
    AS uze ON uz.uz_id uze.uze_uzid AND uze.uze_datum 
    BETWEEN 
    '2006-08-30' AND '2006-09-03' 
    LEFT JOIN u_waehrung AS uw ON u.u_waehrung uw.uw_id 
    LEFT JOIN uz_status uzs ON uz
    .uz_id uzs.uzs_uzid AND uzs.uzs_datum 
    BETWEEN 
    '2006-08-30' AND '2006-09-03' 
    GROUP BY u.u_id 
    HAVING verfuegbar 

    ORDER BY gesamtpreis 
    Liefert folgendes Ergebnis, z.B.:

    PHP-Code:
     u_id uz_id gesamtpreis verfuegbar
    1 1 35 0
    1 2 45 0
    2 1 55 0
    3 1 65 0
    1 3 75 0 
    Jetzt hätte ich es gern so dass von dass von u_id nur derjenige mit dem günstigsten Gesamtpreis angezeigt wird, also solls am Ende so aussehen:

    PHP-Code:
     u_id uz_id gesamtpreis verfuegbar
    1 1 35 0
    2 1 55 0
    3 1 65 0 
    Vorschläge?

    Also bitte nicht mit DISTINCT kommen, das klappt in diesem Fall nicht ... also ich hab eher an eine temporäre Tabelle gedacht, die dann wieder sortiert wird, ein guter Ansatz?
    Zuletzt geändert von aevo; 25.08.2006, 12:27.

  • #2
    verstehe ich dich richtig? den geringsten gesamtpreis? nur eine ausgabe?

    MIN (gesamtpreis) ?

    gruß
    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Klappt so leider nicht, der Gesamtpreis wird ja so berechnet:

      PHP-Code:
      ... IF(u.u_waehrung != 11.00 uw.uw_umrechnung,1) * 
      ((
      uz.uz_stpreis * (ABSTO_DAYS'2006-09-04' ) - TO_DAYS'2006-08-30' )) - 
      COUNTuze.uze_uzid )) + SUMuze.uze_preis )) * 
      IF(
      u.u_kostenberechnung='Person',5,1)) AS gesamtpreis ... 
      Wenn ich daraus ein MIN(IF ...) AS gesamtpreis mache gibts ein #1111 - Invalid use of group function.

      Kommentar


      • #4
        PHP-Code:
        ORDER BY gesamtpreis ASC LIMIT 0
        ? so auf die schnelle

        gruß
        peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Leider nein, bekomm das "#1111 - Invalid use of group function." leider auch so nicht weg ... geht MIN überhaupt wenn der Wert berechnet wird? Da müsste mySQL erst intern eine Tabelle erstellen, sich die Werte berechnen lassen und dann entscheiden was am "günstigesten" ist.

          Kommentar


          • #6
            nee jetzt ohne MIN

            gruß
            peter
            Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
            Meine Seite

            Kommentar


            • #7
              Schau dir bitte nochmal den Anfangspost an, es soll ja nicht nur das günstige ausgeben werden (sonst hätte ich ja nur das LIMIT an die obere Abfrage setzt müssen) sondern es so von jeder "u_id" nur der günstige Preis ausgeben werden.

              Ich erklär mal den Hintergrund ein wenig damit es deutlicher wird. Also jede Unterkunft hat mehrere Zimmer, jetzt wird eine Suchabfrage gesendet und es wird nach den günstigen Zimmer gesucht. Nun soll jede Unterkunft angezeigt werden und von dieser das günstige Zimmer, dies klappt zur Zeit leider noch nicht und so sind unter den z.B. fünf günstigen eine Unterkünfte mit ihren verschiedenen Zimmern.

              Kommentar


              • #8
                ach so, jetzt verstehe ich. auf die schnelle würde ich sagen, dass du das mit php verarbeiten mußt. mit sql stößt du da, glaube ich, an die grenzen.

                gruß
                peter
                Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                Meine Seite

                Kommentar


                • #9
                  Wäre super wenn man es per SQL lösen könnte, mir hat damals auch jeder gesagt die Berechnung wäre nur per PHP zu lösen. Dies konnte ich zum Glück wiederlegen. Nur hier fehlt mir die Erfahrung mit temporären Tabellen ... glaub nur so ist es zu lösen, oder was sagen die SQL Experten?

                  Kommentar


                  • #10
                    Wegen Urlaub usw. hing das Thema leider ein wenig durch aber nun bin ich wieder zurück und hab es gleich mit temporary tables versucht zu lösen und glaub ich bin kurz dass es gelingt. Es gibt nur noch folgenden Fehler bei der SELECT Abfrage von der tmp Table.

                    Also folgendes klappt und gibt ein Ergebnis aus

                    PHP-Code:
                    CREATE TEMPORARY TABLE tmp (
                    `
                    uidINT UNSIGNED NOT NULL ,
                    `
                    uzidINT UNSIGNED NOT NULL ,
                    `
                    preisDOUBLE(16,2NOT NULL ,
                    `
                    verfuegbarSMALLINT NOT NULL);

                    INSERT INTO tmp SELECT u.u_iduz.uz_id
                    IF(
                    u.u_waehrung != 11.00 uw.uw_umrechnung,1)
                    * ((
                    uz.uz_stpreis * (ABSTO_DAYS'2006-11-16' ) - TO_DAYS'2006-11-14' )) - 
                    COUNTuze.uze_uzid )) + SUMuze.uze_preis )) *
                    IF(
                    u.u_kostenberechnung='Person',2,1)) AS gesamtpreisAS verfuegbar
                    FROM unterkunft 
                    AS u
                    LEFT JOIN verband 
                    AS v ON v.v_id u.u_vid
                    LEFT JOIN v_gebiet 
                    AS vg ON vg.vg_id v.v_vgid
                    LEFT JOIN v_gebiet_land 
                    AS vgl ON vgl.vgl_id vg.vg_land
                    LEFT JOIN u_zimmer 
                    AS uz ON uz.uz_uid u.u_id
                    LEFT JOIN u_kategorie 
                    AS uk ON uk.uk_id u.u_kategorie
                    LEFT JOIN uz_verpflegungsarten 
                    AS uzv ON uzv.uzv_id uz.uz_stverpflegung
                    LEFT JOIN uz_expreise 
                    AS uze ON uz.uz_id uze.uze_uzid
                    AND uze.uze_datum
                    BETWEEN 
                    '2006-09-18'
                    AND '2006-09-18'
                    LEFT JOIN u_waehrung AS uw ON u.u_waehrung uw.uw_id
                    LEFT JOIN uz_status uzs ON uz
                    .uz_id uzs.uzs_uzid
                    AND uzs.uzs_datum
                    BETWEEN 
                    '2006-09-18'
                    AND '2006-09-18'
                    WHERE (
                    uz.uz_personen uz.uz_abweichung
                    ) <=5
                    AND uz.uz_personen >=5
                    GROUP BY u
                    .u_iduz.uz_personen
                    HAVING verfuegbar 
                    0
                    ORDER BY gesamtpreis
                    ;

                    SELECT FROM tmp
                    Ergebnis:

                    PHP-Code:
                     uid         uzid         preis         verfuegbar
                    3     10     32.00     0
                    3     9     88.00     0
                    2     4     180.00     0 
                    Doch wenn ich

                    PHP-Code:
                    SELECT FROM tmp
                    mit folgendem tausche

                    PHP-Code:
                    SELECT FROM tmp ORDER BY uid
                    gibt es diesen Fehler

                    PHP-Code:
                    Fehler

                    SQL
                    -BefehlBearbeiten

                    SHOW KEYS FROM

                    MySQL meldet
                    Dokumentation
                    #1064 - You have an error in your SQL syntax near '' at line 1 
                    Warum?

                    Ach kann mir noch kurz jemand erklären wie MySQL sicher geht dass es die Tabelle nur einmal gibt, test es dies davor? Wie heißen dann die weiteren Tabellen?
                    Zuletzt geändert von aevo; 19.09.2006, 10:20.

                    Kommentar


                    • #11
                      Ach die verwendete MySQL Version lautet 3.23.49. Vielleicht hilfts beim Fehler suchen. Ich hab zwar heute morgen weiter getestet und im Internet dazu gesucht, konnte aber nichts finden.

                      Nachtrag: Also hab nun weiter getest und ich kann alles mit der temporären Tabellen anstellen bis zu dem Punkt wenn ich GROUP BY / ORDER BY mit ins Spiel bringe. Gibts da einen bekannten Fehler?
                      Zuletzt geändert von aevo; 19.09.2006, 11:30.

                      Kommentar


                      • #12
                        Hat keiner irgendwelche Tipps / Erfahrungen mit Temporary Tables bei der MySQL Version?

                        Eigentlich sollte die Geschichte doch klappen oder?

                        Kommentar

                        Lädt...
                        X