Autor Zpráva
Easygoer
Profil
1V MySQL mám dvě tabulky "klienti" a "zaznamy".
2 
3CREATE TABLE IF NOT EXISTS `zaznamy` (
4  `id_zaznamu` int(5) NOT NULL AUTO_INCREMENT,
5  `id_klienta` int(4) NOT NULL,
6  `datum` datetime NOT NULL,
7  `zaznam` text COLLATE utf8_czech_ci NOT NULL,
8  `nedovolano` int(1) NOT NULL,
9  PRIMARY KEY (`id_zaznamu`),
10  FULLTEXT KEY `zaznam` (`zaznam`)
11) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
12 
13Nyní potřebuji, aby se mi zobrazil výpis těch klientů,
14jejichž poslední záznam má hodnotu nedovolano > 0
15a zároveň je datum tohoto záznamu v rozmezí posledních 14 dnů.
16 
17select concat(klienti.jmeno, ' ', klienti.prijmeni) as cele_jmeno, convert(zaznamy.datum, date) as datum
18from klienti, zaznamy 
19where zaznamy.id_klienta = klienti.id_klienta
20and zaznamy.datum = max(zaznamy.datum)
21and zaznamy.nedovolano > 0
22and convert(zaznamy.datum, date) between (select current_date - interval 14 day) and current_date 
23order by datum;
24 
25Tohle je samozřejmě špatně. Bohužel netuším, jak zapracovat funkci max(datum).
26Poradíte?
V MySQL mám dvě tabulky "klienti" a "zaznamy".
 
CREATE TABLE IF NOT EXISTS `zaznamy` (
  `id_zaznamu` int(5NOT NULL AUTO_INCREMENT,
  `id_klienta` int(4NOT NULL,
  `datum` datetime NOT NULL,
  `zaznam` text COLLATE utf8_czech_ci NOT NULL,
  `nedovolano` int(1NOT 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, dateas 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, datebetween (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
select version() from dual
nebo vyzkoušíte např. dotaz
select row_number() over() poradi from dual
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.

1select id_klienta, max(datum) as datum, nedovolano 
2from zaznamy 
3group by id_klienta 
4having nedovolano > 0 
5order by id_klienta
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"

1SELECT CONCAT(klienti.jmeno, ' ', klienti.prijmeni) AS cele_jmeno, zaznamy.id_klienta, convert(zaznamy.datum, date) as datum
2FROM klienti, zaznamy
3WHERE zaznamy.id_klienta = klienti.id_klienta
4AND (zaznamy.id_klienta, zaznamy.datum)
5IN (select id_klienta, max(datum) FROM zaznamy group by zaznamy.id_klienta)
6AND zaznamy.nedovolano > 0
7AND convert(zaznamy.datum, date) between (select current_date - interval 14 day) and current_date
8ORDER BY datum;
SELECT CONCAT(klienti.jmeno, ' ', klienti.prijmeni) AS cele_jmeno, zaznamy.id_klienta, convert(zaznamy.datum, dateas 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, datebetween (select current_date - interval 14 day) and current_date
ORDER BY datum;
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.

Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:


Běda vám, jestli to bude blábol.

0