Autor Zpráva
Easygoer
Profil
V MySQL mám dvě tabulky "klienti" a "zaznamy".

CREATE TABLE IF NOT EXISTS `zaznamy` (
  `id_zaznamu` int(5) NOT NULL AUTO_INCREMENT,
  `id_klienta` int(4) NOT NULL,
  `datum` datetime NOT NULL,
  `zaznam` text COLLATE utf8_czech_ci NOT NULL,
  `nedovolano` int(1) NOT NULL,
  PRIMARY KEY (`id_zaznamu`),
  FULLTEXT KEY `zaznam` (`zaznam`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

Nyní potřebuji, aby se mi zobrazil výpis těch klientů,
jejichž poslední záznam má hodnotu nedovolano > 0
a zároveň je datum tohoto záznamu v rozmezí posledních 14 dnů.

select concat(klienti.jmeno, ' ', klienti.prijmeni) as cele_jmeno, convert(zaznamy.datum, date) as datum
from klienti, zaznamy 
where zaznamy.id_klienta = klienti.id_klienta
and zaznamy.datum = max(zaznamy.datum)
and zaznamy.nedovolano > 0
and convert(zaznamy.datum, date) between (select current_date - interval 14 day) and current_date 
order by datum;

Tohle je samozřejmě špatně. Bohužel netuším, jak zapracovat funkci max(datum).
Poradíte?
Kajman
Profil
Máte verzi databáze podporující window funkce? Tedy se podíváte na výsledek funkce version() a porovnáte s manuálem zvolené databáze
select version() from dual
nebo vyzkoušíte např. dotaz
select row_number() over() poradi from dual
Easygoer
Profil
version()
5.6.15-log


Bohužel netuším, co dál...
Kajman
Profil
Pokud nejde opusit 11 let starou verzi, tak to moc jednoduše a čitelně jen v sql nepůjde, nebo do toho zahrnout např. php a logiku si vyřešíte tam.

A jste si vůbec jistý zadáním? Když se mi spamer nedovolal před 13 dny, tak mě to vyplivne, i když mi už mezitím 3x volal a řekl jsem mu, ať mě už nikdy nevolá. Tedy mi zavolá po čvrté?
Easygoer
Profil
Díky za odpověď. Je to systém na obvolávání klientů. Chci si vytvořit přehled klientů, kterým jsem se nedovolal, abych jim zkoušel volat znovu.
Asi by šlo nainstalovat si nový Easy PHP Devserver, ale stejně nevím, jak to potom vyřešit.
Kajman
Profil
Zkuste to zkombinovat s Funkce max(datum) nevrací vždy správný výsledek

Nebo aktualizovat server.
Easygoer
Profil
Možná by mi úplně stačilo, kdybych (pro zjednodušení) dokázal vypsat id všech klientů, jejich poslední záznam má hodnotu nedovoláno > 0.

select id_klienta, max(datum) as datum, nedovolano 
from zaznamy 
group by id_klienta 
having nedovolano > 0 
order by id_klienta

Ve výsledku se bohužel ukazují i klienti, kteří mají záznamy s nedovolano > 0, ale ten poslední má nedovolano = 0.
Nechápu, proč...
Easygoer
Profil
Tak už to funguje! Díky za tip "Zkuste to zkombinovat s Funkce max(datum) nevrací vždy správný výsledek"

SELECT CONCAT(klienti.jmeno, ' ', klienti.prijmeni) AS cele_jmeno, zaznamy.id_klienta, convert(zaznamy.datum, date) as datum
FROM klienti, zaznamy
WHERE zaznamy.id_klienta = klienti.id_klienta
AND (zaznamy.id_klienta, zaznamy.datum)
IN (select id_klienta, max(datum) FROM zaznamy group by zaznamy.id_klienta)
AND zaznamy.nedovolano > 0
AND convert(zaznamy.datum, date) between (select current_date - interval 14 day) and current_date
ORDER BY datum;

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