[MySQL] Nur jeweils neusten Eintrag selektieren

Chosi

Mitglied

Hallo zusammen,

ich versuche mich gerade an folgedem Problem: Ich habe eine Tabelle, welche Rückgabewerte von diversen Kommandos speichert. Die Tabelle referenziert jeweils das ausgeführte Kommando und den Client, auf welchem das Kommando ausgeführt wurde:

Code:
CREATE  TABLE IF NOT EXISTS `Project_testing`.`command_result` (
  `command_result_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `command_id` INT UNSIGNED NOT NULL ,
  `client_id` INT UNSIGNED NOT NULL ,
  `result_value` TEXT(3000) NULL ,
  `created` TIMESTAMP NOT NULL DEFAULT NOW() ,
  PRIMARY KEY (`command_result_id`) ,
  [...]
)

Nun würde ich gerne die Ergebnisse der jeweils zuletzt ausgeführten Kommandos eines Clients selektieren. Zum Beispiel alle Kommandos auf client_id = 12, davon jedoch jeweils nur das Aktuellste.

Hat jemand eine Idee, wie man das am Besten macht? Ich komme gerade irgendie auf keinen grünen Zweig :-/...

Code:
SELECT *
FROM command_result
WHERE client_id = 12
ORDER BY created DESC

Würde mir jetzt beispielsweise alle Datensätze liefern, wie kann ich das nun weiter einschränken, so dass nur jeweils der neuste Datensatz geliefert wird?

Danke & Gruß
 
Zuletzt bearbeitet:
Hi,

mit LIMIT kommt man hier leider nicht weiter. Wenn man nach Datum absteigend sortiert, stehen zwar die neusten Datensätze oben, aber hier können dann ja auch Kommandos doppelt vorkommen. Außerdem wüsste man ja gar nicht, wo man das Limit setzen sollte...

Bei folgenden Daten, sollte das Query nur die erste und dritte Zeile liefern:
Code:
vollständige Textfelder  	command_result_id 	command_id 	client_id 	result_value 	created
	Bearbeiten 	Löschen 	12 	8 	1 	last8 	2009-01-10 02:06:06
	Bearbeiten 	Löschen 	11 	8 	1 	last8 	2009-01-10 02:06:05
	Bearbeiten 	Löschen 	10 	9 	1 	last9 	2009-01-10 02:05:55
	Bearbeiten 	Löschen 	8 	8 	1 	last1 	2009-01-10 01:23:05
 
Hi,

hab' ich auch schon versucht. Mittels MAX(created) und GROUP BY command_id bekomme ich zwar das jeweils neuste Datum, aber nicht den zugehörigen Datensatz..

hmm...
 
evtl. so?
PHP:
select a.* 
from command_result a
join (
			select max(created) created
							,command_id			
			from  command_result
			group by command_id
			)b 
on a.created = b.created

Bei MySQL gibt es evtl. Analytische Funktionen die Lösen sowas eleganter!?

Grüße
 
Hallo,

da ich mit Oracle entwickle habe ich mal im Netz gestöbert und für MySQL eine analytische sog. "RANK" Funktion gebaut. Die sollte Dir alles beschreiben was Du benötigst.
SQL:
select a.*
from
(  
	select if (@command_id =  command_id, @rn := @rn + 1, @rn := 1 + least(0, @command_id  := command_id)) rownum,
        command_id,
        created,
        command_result_id,
        client_id
        
 from  command_result,
      (select (@command_id := 0)) as x
 order  by command_id, created desc
)a
where rownum = 1;

Jetzt als Wirkliche RANK Funktion:

SQL:
 select *
    from (select if (@comid = command_id, 
                       if ( @created = created,
                            @rnk := @rnk + least(0,  @inc := @inc + 1),
                            @rnk := @rnk +  greatest(@inc, @inc := 1)
                                        + least(0,  @created := created)),
                       @rnk := 1 + least(0, @comid  := command_id) 
                                + least(0, @created :=  created)
                                   + least(0, @inc :=  1)) rank,
                command_result_id, 	command_id, 	client_id ,	result_value, 	created
         from command_result,
                (select (@command_id := 0)) as x
         					order by command_id, created desc) as y
     where rank = 1;

Kannst Du bitte in dem Titel bitte folgendes mit eingeben, dann findet man das auch wenn man sucht: analytische Funktione RANK.

Vielen Dank und Grüße
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück