Group by/max() Problem

BenschM@ster

Mitglied
Hallo,
ich Liste auf meiner Seite die Suchanfragen aus der internen Suche aus.
Jede einzelne Suchanfrage wird in einer Tabelle gespeichert, zusammen mit der Anzahl der Ergebnisse die gefunden wurden.

Da ein Suchwort mehrmals vorkommen kann, benutze ich group by um jedes Suchwort nur einmal anzeigen zulassen, zusammen mit der Häufigkeit die es gefunden wurde.

Außerdem wird mir angezeigt wann der Begriff zuletzt gesucht wurde.

Das sieht bisher so aus:

PHP:
SELECT count(keyword),keyword,max(datum) from such_statistik WHERE keyword != '' GROUP BY keyword

Was ich jetzt noch möchte ist, dass die Anzahl der Ergebnisse angezeigt wird, die beim letzten mal, als die Suchphrase eingegeben wurde, angezeigt wird.

Also quasi das Feld "anz_ergebnisse" aus der Zeile die mit max(datum) gewählt wird.

Ist das möglich?

Danke schon im Voraus!

Grüße
 
sowas?
SQL:
SELECT  count(*) AS anz_ergebnisse,
		keyword,
FROM 	such_statistik 
WHERE	datum IN (SELECT max(datum) FROM such_statistik WHERE keyword != '')
GROUP BY keyword
 
Hey, danke schonmal für eure Antworten.

@yaslaw: Dein Ansatz scheint mir das zu sein was ich suche.

Bekomme aber den Fehler
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM such_statistik WHERE datum IN (SELECT max(datum) FROM such_statistik W' at line 3
vom SQL.

Kann den Fehler noch nicht sehen, versuche ihn noch zu Orten.

Danke schonmal.

@Steusi:
Die Tabelle sieht wie folgt aus:

| id | keyword | anz_ergebnisse | datum |

ID ist klar
keyword ist das Suchwort
anz_ergebnisse sind die Ergebnisse die zum Zeitpunkt der Suche von der Suche gefunden wurden
datum ist der Timestamp der Suchanfrage.

Grüße
 
Ohwei ich Depp, hätte ich sehen müssen ;)

Leider doch nicht ganz was ich wollte.

Ich versuchs mal im Pseudo Code auszudrücken:

Nimm keyword,häufigkeit(keyword),max(datum), und anz_ergebnisse(where datum=max(datum)) FROM such_statistik group by keyword

So etwa müsste das aussehen.

Was ich also brauche ist ein Befehl, dass ein "where" nur auf eine einzelne Spalte angewendet wird.
 
So auf die Schnelle...
SQL:
SELECT
	dat.*,
	st.anz_ergebnisse
FROM	
	such_text AS st,
	(
		SELECT 
			keyword,
			count(*) AS cnt,
			max(datum) AS max_datum
		FROM 
			such_statistik 
		WHERE 
			keyword != ''
		GROUP BY keyword
	) dat
WHERE	
	st.datum = dat.max_datum
	AND st.keyword = dat.keyword
 
Zuletzt bearbeitet von einem Moderator:
Ja, ich mache das auch beruflich. Wobei dieses hier nicht wirklich komplex ist.
Zum Fehler: ersetze den Tabellennamen such_text durch such_statistik. Sowas passiert mir häufig wenn ich SQLs schreibe ohne zu testen.

Erklärung:
Es gibt ein inneres SQL, dass die Daten gruppiert, die Zeilen zählt und das grösste Datum auswählt
SQL:
-- subqery dat
        SELECT 
            keyword,
            count(*) AS cnt,
            max(datum) AS max_datum
        FROM 
            such_statistik 
        WHERE 
            keyword != ''
        GROUP BY keyword

Dieses fasse ich nochmals mit der Tabelle zusammen. Ich verknüpfe über das Datum und das keyword
SQL:
SELECT
    dat.*,
    st.anz_ergebnisse
FROM    
    such_satisitik AS st,
    (
        [dat] --das QUery von oben
    ) dat
WHERE   
    st.datum = dat.max_datum
    AND st.keyword = dat.keyword
 
Zuletzt bearbeitet von einem Moderator:
Goil :)
Des rennt!

Ist ja der absolute Wahnsinn was möglich ist.
Dank deiner Erklärung hab ich das Ding sogar verstanden. Wie erlernst du sowas? Durch Bücher?

Wenn ich bei Google nach entsprechenden Tutorials suche, dann weiß ich immer nicht wonach ich da suchen muss.

Vielen Dank! Super Code, super Geduld und super Erklärung.

Ich liebe das Forum hier ;)

Grüße
 
Zurück