Autor Zpráva
tomkralik
Profil
Ahoj lidičky,
prosím poraďte.
Mám takovouto tabulku

id|user|car|department|datum
-----------------------------
1|815|1|4|2012-01-12 14:03:00
4|796|1|3|2012-01-12 15:30:00
5|816|3|1|2012-01-13 08:29:00
6|817|1|1|2012-01-13 08:45:00
7|489|33|4|2012-01-13 09:55:00
8|816|73|1|2012-01-16 09:46:00
9|817|22|1|2012-01-16 09:47:00
10|818|73|1|2012-01-16 09:58:00

Potřeboval bych získat 1 záznam od každého CAR ale ten nejnovější, tedy např.
10,818,73,1,2012-01-16 09:58:00
6|817|1|1|2012-01-13 08:45:00
9|817|22|1|2012-01-16 09:47:00
...
...
Zkoušel jsem DISTINCT a i GROUP BY, ale nepodařilo se mi dostat správný výsledek. Neobdržel jsem datumově nejnovější záznam.
Používám

Mooc díky

Selecty, které jsem zkoušel.
select DISTINCT (caus.car), us.name AS user, de.name AS depart
                    from cars_users AS caus
                    left join users us on us.id=caus.user
                    left join department de on de.id=caus.department
            left join cars ca on ca.id=caus.car
order BY caus.datum
nebo
select ca.spz,us.name AS user, de.name AS depart
                    from cars_users AS caus
                    left join users us on us.id=caus.user
                    left join department de on de.id=caus.department
            left join cars ca on ca.id=caus.car

GROUP by caus.car
order BY caus.datum
Kajman
Profil
Viz. 3. příklad z faq.
tomkralik
Profil
Kajman:
mooc díky, dostal jsem správný výsledek. Tedy IDčka.

Prosím poradil bys ještě jak bych to mohl propojit s tabulkami přes left join, abych dostal místo ID přímo "jméno"

díky
Kajman
Profil
inner join cars ca on ca.id=t1.car
tomkralik
Profil
Kajman:
tak jsem zkoušel
select t1.car, t1.user
from   cars_users t1,
       (select t2.car, t2.user, t2.department,max(t2.datum) datum
        from cars_users t2
        group by t2.car) t3
inner join cars ca on ca.id=t1.car
where  t1.car = t3.car
       and t1.datum = t3.datum;
a zobrazí se chyba: Chyba v dotazu: Unknown column 't1.car' in 'on clause'


tak jsem se s tím popral a i doufám úspěšně.
pro úplnost přikládám funkční query

základní query
select t5.*, us.name AS uzivatel
from 
(select t1.id, t1.car, t1.user, t1.department, t1.datum
from   cars_users t1,
       (select t2.car, max(t2.datum) datum
        from cars_users t2
        group by t2.car) t3
where  t1.car = t3.car
       and t1.datum = t3.datum)
t5
left join users us on us.id=t5.user

finální query
select t5.id, t5.car,ca.name As auto, t5.user,us.name as uzivatel,t5.department,de.name as depart,t5.datum
from 
(select t1.id, t1.car, t1.user, t1.department, t1.datum
from   cars_users t1,
       (select t2.car, max(t2.datum) datum
        from cars_users t2
        group by t2.car) t3
where  t1.car = t3.car
       and t1.datum = t3.datum)
t5
left join cars ca on ca.id=t5.car
left join users us on us.id=t5.user
left join department de on de.id=t5.department

doufám, že to pomůže někomu dalšímu.

mooc díky za nakopnutí ...
Kajman
Profil
tomkralik:
To bylo prioritami spojování, kdy cross join zapsaný čárkou se bude dělat až po inner joinu.

Stačilo přehodit pořadí t1 a t3 a nemuselo by to být v dalším poddotaze. Ale z hlediska rychlosti budou nejspíše oba zápisy totožné.
tomkralik
Profil
Kajman:
Ahoj,
prosím poradil bys mi ještě jak upravit výše uvedený finální query tak aby ve výsledku byly zahrnuty i car (ca.spz), které nemaji záznam v cars_users z níž se čerpá nyní?
Nevím zda je to vůbec možné.

Mooc díky
Kajman
Profil
right join cars ca on ca.id=t5.car
tomkralik
Profil
Kajman:
jak jednoduché když to člověk zná ...

super, mooooc díky

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: