Problem mit MIN/MAX

Tommy57

Erfahrenes Mitglied
Hallo,

habe ein kleines Problem mit einem SELECT Befehl.

Wie kann ich in einem JOIN den letzten Preis (spätestes Verrkaufsdatum) auslesen, wenn nach DISTINCT Baujahr sortiert ist?

SQL:
                          ...
                          LEFT JOIN(
                                    SELECT
                                        DISTINCT baujahr,
                                        MAX(verkaufsdatum),
                                        preis AS letzterPreis
                                      FROM test
                                      WHERE id_auto = $auto
                                    GROUP BY
                                        baujahr
                           ...
Das funktioniert scheinbar nicht, weil ich da für MIN() und MAX() immer das selbe Ergebnis bekomme.

Das wäre super, wenn mir jemand kurz helfen könnte.

Gruß
 
Zuletzt bearbeitet von einem Moderator:
item: DISRINCT hart nix mit dem Feld Baujahr zu tun. Es sagt, dass doppelte Zeilen unterdrückt werden.

item: auf den Preis hast du keine Gruppierungsfunktion

Du musst in einer Unterafrage zuerst das max-datum zu jedem Baujahr festlegen und dann dies mit der Tabelle verknüpfen
SQL:
SELECT
	test.baujahr,
	test.verkaufsdatum,
	test.preis
FROM
	test
	INNER JOIN (
				SELECT
					baujahr,
					MAX(verkaufsdatum) AS max_verkaufsdatum
				FROM
					test
				GROUP BY
					baujahr
				) AS maxdate
		ON test.baujahr = maxdate.baujahr
		AND test.verkaufsdatum = maxdate.max_verkaufsdatum
 
Zuletzt bearbeitet von einem Moderator:
mir würde da noch eine Lösung einfallen ohne extra Unterabfrage - zwar ungetestet sollte aber klappen.

Wenn du beim Datum noch ne Uhrzeit hast oder nen Zeitstempel musst du halt die substr. noch anpassen.

SQL:
SELECT 
         max( concat( datum, preis ) ) AS helper, 
         substr( max( concat( datum, preis ) ) , 1, 10 ) AS Datum, 
         substr( max( concat( datum, preis ) ) , 11 ) AS Preis, 
         baujahr
FROM test
GROUP BY baujahr
 
Zuletzt bearbeitet von einem Moderator:
item: DISRINCT hart nix mit dem Feld Baujahr zu tun. Es sagt, dass doppelte Zeilen unterdrückt werden.

Ich hätte vllt erwähnen sollen, dass ich hier für die einzelnen baujahre den niedrigsten, höchsten, ältesten und jüngsten preis auslesen will, deswegen auch DISTINCT, weil ich ja jedes Baujahr auch nur einmal aufgelistet haben will. Das krieg ich halt nicht hin, weil ich scheinbar MySQL nicht richtig verstanden habe.

Der Punkt ist ja, dass ich alle Preise haben will, wo das niedrigste und höchste datum je Baujahr steht. Ich hätte ja der Logikhalber gesagt, dass muss so ne Art WHERE Bedingung sein. Gib mir Preis pro Baujahr, wo Min/Max Datum. Ich habe irgendwie falsche Vorstellungen von MySQL...

Ach und danke vandamp, dein Code sieht cool aus, aber mir gefällt der Stil vom yaslaw besser, weil ich den so gut anpassen kann, je nachdem, wie ich gerade was brauche
 
Zuletzt bearbeitet:
mysql macht es schon rtichtig. Dein SQL ist entsprechend falsch.


Aber so sollte es gehen
SQL:
SELECT
	test.baujahr,
	test.verkaufsdatum,
	test.preis
FROM
	test
	INNER JOIN (
				SELECT
					baujahr,
					MAX(verkaufsdatum) AS max_verkaufsdatum,
					MIN(verkaufsdatum) AS min_verkaufsdatum
				FROM
					test
				GROUP BY
					baujahr
				) AS minmaxdate
		ON test.baujahr = maxdate.baujahr
		AND (test.verkaufsdatum = minmaxdate.max_verkaufsdatum OR test.verkaufsdatum = minmaxdate.min_verkaufsdatum)
 
Zuletzt bearbeitet von einem Moderator:
Danke nochmal für die schnelle Antwort, aber ich werde nicht schlau aus dem Code.

Also wie gesagt, ich brauche den jüngsten(neusten) Preis zu jedem Baujahr und den ältesten Preis zu jedem Baujahr. Ich versteh nicht, wie mir das Statement dieses Resultat liefern soll?! Also es ist ja so, dass jedes Baujahr genau einen jüngsten und einen ältesten Verkaufspreis hat. Kannst du mir da erklären, wieso das Statement mir diese Werte liefert (hab das Statement noch nicht getestet, weil ich es erst verstehen will, hab lauter solcher Abfragen), also ich versteh das nicht richtig.

Gruß
 
hallo,

bei yaslaws query sollten aber 2 Zeilen herauskommen sprich

Baujahr Preis Datum
2010 30 2010-12-30
2010 10 2010-01-05

zu yaslaws query:
er sucht sich mit
SQL:
                SELECT
                    baujahr,
                    MAX(verkaufsdatum) AS max_verkaufsdatum,
                    MIN(verkaufsdatum) AS min_verkaufsdatum
                FROM
                    test
                GROUP BY
                    baujahr

pro Baujahr das jüngste und älteste Datum verknüpft es dann mit der Tabelle Test über

SQL:
test.baujahr = maxdate.baujahr AND 
(test.verkaufsdatum = minmaxdate.max_verkaufsdatum OR 
 test.verkaufsdatum = minmaxdate.min_verkaufsdatum)

er sagt, er will alle Datensätze aus der Tabelle Test haben wo,
1. das Baujahr ident ist
2. das Datum entweder dem jüngstem oder dem ältesten Datum je Baujahr entspricht

Ich weiß, du willst meinen Code nicht aber

SQL:
SELECT 
baujahr,
substr( max( concat( datum, preis ) ) , 1, 10 ) AS max_Datum, 
substr( max( concat( datum, preis ) ) , 11 ) AS max_Preis, 
substr( min( concat( datum, preis ) ) , 1, 10 ) AS min_Datum, 
substr( min( concat( datum, preis ) ) , 11 ) AS min_Preis
FROM test
GROUP BY 
baujahr

liefert genau das Ergebnis, was du dir vorstellst und ist auch nicht wirklich schwer zu verstehen.

SQL:
substr( max( concat( datum, preis ) ) , 1, 10 ) AS max_Datum

substr beschneidet einen string
max sollte dir bekannt sein
concat verbindet 2 strings miteinander sprich aus Datum 2010-01-20 und Preis 1000 wird 2010-01-201000
 
Zuletzt bearbeitet von einem Moderator:
ACH WIE KRASS, okay jetzt check ich erst dein Statement. Ich hatte es zuerst nicht ganz verstanden. Super danke. Das tut genau das, was ich gesucht habe. Ich werd es gleich mal testen.^^
 
@vandamp
Wahscheinlich ist dein Zusammensetzen und zerlegen nicht gerade sehr performant.
Dazu kommt, dass dein Code ohne Erklärung niemand anderes einfach mal so lesen kann, während meiner dem normalen Standart entspricht.
 

Neue Beiträge

Zurück