Autor Zpráva
jataky
Profil
Zdravím, potřeboval bych poradit a nějak si nevím rady.

mám dvě tabulky:

1. vzt_seznam
id, label, ponor,par

1,"A",1,NULL

2,REH,2,1
3,ven,3,2
4,sem,3,2

5,PATOL,2,1
6,ven,3,5
7,dovn,3,5

8,JIP,2,1
6,ven,3,8
7,dovn,3,8


2. fil_zmeny
datum, id_vzt_seznam

1,2014-01-31,3
2,2013-11-19,3
3,2011-11-19,3

4,2013-02-10,4
5,2011-11-29,4
6,2011-11-19,4

7,2012-02-10,6
8,2014-11-29,6
9,2013-11-19,6

10,2014-01-31,7
11,2013-11-19,7
12,2011-11-19,7

... a potřebuji tento výpis:

REH , 2013-02-10
PATOL, 2014-01-31

(datum jsem získal jako
"SELECT id_vzt_seznam, max(datum) as datum FROM fil_zmeny" tímto získám ===>
3,2014-01-31
4,2013-02-10
fil_zmeny.id_vzt_seznam = vzt_seznam.id AND vzt_seznam.id=vzt_seznam.par a z tohoto výběru vyberu nejmenší datum

Lze toho docílit vnořeným dotazem do databáze mysql a pokud ano jak?

Vím, je to šíleně formulované, ale nevěděl jsem jak bych to jen napsal, aby to bylo srozumitelné.

Děkuji za radu.
juriad
Profil
OK máš strom:
A
- REH #
- - ven *
- - sem *
- PATOL #
- - ven *
- - dovn *
- JIP
- - ven
- - dovn

Kde každý záznam zná svého rodiče (par) a hloubku (ponor).

Dále víme, kdy byly některé záznamy upravované (víme to u těch označených hvězdičkou).

A teď nám chybí otázka;.Co chceš v databázi najít?
Nejspíš chceš rodiče těch změněných a zajímá tě poslední změna dědí. Je tomu tak?

Je dost podstatné, zda se jedná o přímé (děti) nebo nepřímé (vnuky, pravnuky) potomky.
Mají všechny větve stromu hloubku právě 3? Jsou ty změněné vždy listy (nejnižší úroveň) v tom stromu?


p = parent, c = child, z = zmena
SELECT p.label, MAX(z.datum)
FROM vzt_seznam p
JOIN vzt_seznam c ON c.par = p.id
JOIN fil_zmeny z ON z.id_vzt_seznam = c.id
GROUP BY p.id # skupinky podle rodice

Kdyby tě ale zajímalo víc informací, třeba který potomek má nejvyšší datum, tak to už je třeba řešit vnořeným dotazem.
jataky
Profil
juriad:

Výběr je správný, ale datum výpisu je špatný. V databázi každou změnu u dítěte přidávám pod novým id, čímž musím prvně datum vybrat jako MAX(poslední změna u dítěte) a následně MIN(datum dětí daného rodiče). Snad jsem to napsal aspoň trošku srozumitelně.

Jinak strom je správně.
juriad
Profil
jataky:
Aha, ten min-max jsem tam neviděl.

SELECT p.label, MIN(zc.datum)
FROM vzt_seznam p
JOIN (
  SELECT MAX(z.datum) AS datum, c.par
  FROM vzt_seznam c
  JOIN fil_zmeny z ON z.id_vzt_seznam = c.id
  GROUP BY c.id # skupinky podle ditete
) zc ON zc.par = p.id
GROUP BY p.id # skupinky podle rodice
jataky
Profil
juriad:
... úžasné . Přesně to co jsem potřeboval. Jak složité a nakonec jednoduché. Jsi borec. Díky Moc.

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: