MySQL: Min und Max aller gewählten Einträge zeigen (Left Join)

csskoeln

Grünschnabel
Hallo,

ich hab folgendes Query für MySQL:

PHP:
SELECT 
		SELECT
		a.id ,
		UNIX_TIMESTAMP(a.datum) datum ,
		a.kat ,
		a.title ,
		a.userid ,
		a.rang,
		min(a.rang) min_rang,
		max(a.rang) max_rang,
		
		b.aktiv user_aktiv,
		b.user user_username
		
		from artikel_posts a
		LEFT JOIN artikel_user b ON a.userid = b.id	
		
		where a.aktiv = 'J'
		order by a.id desc limit 0,15

Mein Problem ist jetzt, das in min_rang und max_rang natürlich immer noch der min. und max. Wert des einzelnen Eintrages drin steht, ich brauche allerdings den Wert zu allen ohne das ich eine weitere Abfrage durchführen müßte.

Dazu kommt noch, das sich das Limit verändern kann und es sollen nur der min_rang und max_rang der "gewählten" Einträge dargestellt werden.

Als Beispiel wie ich es gerne hätte wenn man von den folgenden Daten ausgeht:
IDUSERIDRANG
110
222
323

Ausgabe sollte dann wie folgt sein:

IDUSERIDRANGMIN RANGMAX RANG
11003
22203
32303

Wie man hier schön sehen kann, ist es egal, was in der Spalte Rang steht.

Jemand eine Idee, wie ich die Abfrage so hinbekommen könnte?
 

Yaslaw

n/a
Moderator
Vereinfacht geht das so
SQL:
SELECT
	d.*,
	m.*
FROM
	mydata AS d,
	(
		SELECT
			MIN(dm.rang) AS min_rang,
			MAX(dm.rang) AS max_rang,
		FROM
			mydata AS dm
	) AS m
 
Zuletzt bearbeitet von einem Moderator:

csskoeln

Grünschnabel
Mahlzeit,

danke dir erst mal, aber das Problem ist, das ich das Left JOIN nicht rein bekomme, hier meldet MySQL dann immer einen Fehler.

Die Userdaten brauche ich dabei schon, sonst bringt das ganze nicht wirklich was, dachte halt, einen Befehl absetzen, statt noch mal einen weiteren nur für die Userdaten.
 

csskoeln

Grünschnabel
Hilfe... Wenn die Kaffeemaschine defekt ist und man den Wald vor lauter Bäumen nicht sieht.
Ich habs,warum einfach, wenn es auch schwer geht?

Vielen Dank!
 

csskoeln

Grünschnabel
Aber klar doch ;-)


Code:
SELECT 
		a.id ,
		UNIX_TIMESTAMP(a.datum) datum ,
		a.title ,		
		a.text ,
		a.bild ,		
		a.userid ,		
		a.rang,
		b.aktiv user_aktiv,
		b.user user_user
		
		,m.*
		from artikel_posts a
		LEFT JOIN artikel_user b ON a.userid = b.id
		
		,
    (
        SELECT
            MIN(dm.rang) min_rang,
            MAX(dm.rang) max_rang
        FROM
            artikel_posts dm
    )  m
	
		where a.aktiv = 'J'
		group by a.id
		order by a.id desc
 

Yaslaw

n/a
Moderator
Noch ein Tipp.
MySQL hat einen Problem. Es ist bei GROUP BY zu tolerant. Dieses SQL funktioniert bei anderen Datenbanken nicht.
Für ein sauberes Query solltest du dir angewöhnen immer alle Felder bei einem GROUP BY die nicht in einr Gruppierungsfunktion (SUM, MAX etc) sind im GROUP BY-Teil aufzulisten.
Beim genauen hinseheh frag ich mich allerdings, warum da überhaubt ein GROUP BY drin ist Der Bringt so angewendet gar nix

SQL:
SELECT 
	a.id ,
	UNIX_TIMESTAMP(a.datum) datum ,
	a.title ,       
	a.text ,
	a.bild ,        
	a.userid ,      
	a.rang,
	b.aktiv user_aktiv,
	b.user user_user,
	m.min_rang,
	m.max_rang
from 
	artikel_posts a
	LEFT JOIN artikel_user b ON a.userid = b.id,
	(
		SELECT
			MIN(dm.rang) min_rang,
			MAX(dm.rang) max_rang
		FROM
			artikel_posts dm
	)  m
WHERE
	a.aktiv = 'J'
-- So müsste der GROUP BY aussehen, wenn es ihn dan brauchen würde:	
-- GROUP BY
--	a.id ,
--	UNIX_TIMESTAMP(a.datum) datum ,
--	a.title ,       
--	a.text ,
--	a.bild ,        
--	a.userid ,      
--	a.rang,
--	b.aktiv user_aktiv,
--	b.user user_user,
--	m.min_rang,
--	m.max_rang
ORDER BY
	a.id DESC
 
Zuletzt bearbeitet von einem Moderator: