Autor Zpráva
Easygoer
Profil
Mám tabulku "pokusy":
CREATE TABLE IF NOT EXISTS `pokusy` (
  `id_zaznamu` int(5) NOT NULL AUTO_INCREMENT,
  `id_klienta` int(4) NOT NULL,
  `datum` datetime NOT NULL,
  PRIMARY KEY (`id_zaznamu`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

U každého id_klienta chci najít záznam s nejnovějším datumem:
SELECT id_klienta, datum FROM `pokusy` WHERE datum = (select max(datum)) group by id_klienta;

Pokud vkládám nové záznamy postupně a datum pomocí now(), je všechno OK.
Pokud ale některé záznamy smažu a vložím nový záznam s nějakým starým datumem, dostanu špatný výsledek.
Domníval jsem se, že funkce max(datum) vrací za každé situace nejnovější datum.
Poradíte, jak docílit, aby SQL našel u každého klienta nejnovější datum,
i v případě, kdy se některé záznamy mažou a občas se přidá starší datum?
Děkuji.



Zapomněl jsem dodat, že se to týká MySQL.
Kajman
Profil
SELECT id_klienta, datum FROM `pokusy` WHERE (id_klienta, datum) IN (select id_klienta, max(datum) FROM pokusy group by id_klienta);
Easygoer
Profil
Super. Díky moc.


Teď bych tam ještě potřeboval dostat podmínku, aby mi to zobrazilo jen ty výsledky, kde je poslední nazelené datum starší cca 6 měsíců.
Tzn. DATEDIFF(CURRENT_DATE, datum) > 180
Bohužel nevím, kam to zapsat... Poradíte?
Easygoer
Profil
Už jsem na to asi přišel:
SELECT id_klienta, datum FROM `pokusy` WHERE DATEDIFF(CURRENT_DATE, datum) > 180 and (id_klienta, datum) IN (select id_klienta, max(datum) FROM pokusy group by id_klienta);
Kajman
Profil
Pro omezení výběru dle výsledků agregační funkce se používá sekce having. Pokud stačí jen ty dva sloupce, tak to jde i bez toho poddotazu.

SELECT id_klienta,
       Max(datum) datum
FROM   pokusy
GROUP  BY id_klienta
HAVING Max(datum) > Date_sub('2024-07-17', INTERVAL 180 DAY)

Dotazu prospěje jeden index na dvěma sloupci (id_klienta, datum).
Easygoer
Profil
Kajman:
Díky, vyzkouším to.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0