Autor | Zpráva | ||
---|---|---|---|
peta Profil |
Resim registrace konferenci.
a) Muze nastat situace, ze se clovek registruje 2x na tutez konferenci, jednou prijde v pondeli, podruhe v patek. Cili na 2 dny potrebuje ubytovat. b) Muze nastat situace, ze 2x omylem vyplne registraci pro 2 ruzne dny. A puvodne chtel jen 1 den byt na konferenci. Ja bych potreboval vysledny seradit tak, aby zmena rekneme za poslednich 7 dni byla nahore podle data posledni zmeny. Pokud tam jsou zaznamy i predchozich registraci, ktere nesplnuji podminku zmeny za poslednich 7 dni, aby byli oba zaznamy u sebe. Sloupce jsou treba id_jmeno, jmeno, zmenadatum Mam to ted takto lojza (id=3) | 6 dni pepa (id=5) | 6 dni --- tonda (id=1) | 20 dni pepa (id=5) | 21 dni Potrebuji to lojza (id=3) | 6 dni pepa (id=5) | 6 dni pepa (id=5) | 21 dni --- tonda (id=1) | 20 dni |
||
Tori Profil |
#2 · Zasláno: 8. 10. 2013, 13:48:49
Ke každému jménu potřebujete jeho ID a nejmenší počet dní ze všech jeho registrací, připojíte (podle ID) výsledek k hlavnímu dotazu a seřadíte podle 1. nejmenší počet dní ASC, 2. ID/jméno, 3. skutečný počet dní ASC.
|
||
peta Profil |
#3 · Zasláno: 8. 10. 2013, 14:05:50
Jo, dik, logiku ted chapu. Musim jeste vymyslet, jak to provest. Moc ty komplikovanejsi dotazy nedavam, aspon ne moc optimalizovane :) Skoda, ze neni nic podobne ve faq.
|
||
peta Profil |
SELECT IF (`b`.`logdate` >= DATE_SUB(NOW(), INTERVAL 30 DAY) ,'NEW','') AS `reg_new` ,`b`.`logdate` AS `reg_xdate` ,`a`.`name1` AS `user_name1` ,`a`.`name2` AS `user_name2` ,`d`.`name_en` AS `conf_name_en` FROM `c_user` `a` LEFT JOIN `c_reg` `b` ON `b`.`iduser`=`a`.`iduser` AND `c`.`idconf`=`b`.`idconf` LEFT JOIN `c_conf` `d` ON `d`.`idconf`=`b`.`idconf` LEFT JOIN `c_user` `aa` ON `aa`.`iduser`=`a`.`loguser` LEFT JOIN `c_user` `ba` ON `ba`.`iduser`=`b`.`loguser` LEFT JOIN ( SELECT `a`.`iduser`, MAX(`b`.`logdate`) AS reg_xdatemin FROM `c_user` `a` LEFT JOIN `c_reg` `b` ON `b`.`iduser`=`a`.`iduser` GROUP BY `a`.`iduser` ) AS `bx` ON `bx`.`iduser`=`a`.`iduser` WHERE `b`.`idconf`=4 ORDER BY `bx`.`reg_xdatemin` DESC, `a`.`name2` ASC, `a`.`name1` ASC 1. se musi pouzit max, protoze mne zajima nejnovejsi datum a datumove razitko je pro nejnovejsi zaznam vetsi cislo, ale detail 2. serazuje mi to nejak divne... V originalu je treba -- `b`.`logdate` DESC -- tam je jen tohle NEW 2013-09-12 Eva Šrámková NEW 2013-09-12 Tiziana Di Salvo NEW 2013-09-12 Olindo Zanotti NEW 2013-09-12 Chris Done NEW 2013-09-11 Frederic Vincent NEW 2013-09-11 Juri Poutanen sql dotaz nahore vyplodi NEW 2013-09-12 Eva Šrámková ---- 2013-09-09 Gabriel Torok --- ani neodpovida 30 dnum NEW 2013-09-10 Martin Urbanec NEW 2013-09-11 Dalibor Wzientek NEW 2013-09-25 Chris Fragile NEW 2013-09-24 Luigi Piro |
||
Tori Profil |
Co je tabulka s aliasem c? V poddotazu by imho mělo také být omezení na ID konference. Ale spíš bych jako hlavní tabulku použila
c_reg (trochu jsem si přejmenovala aliasy):
SELECT IF (`r`.`logdate` >= DATE_SUB(NOW(), INTERVAL 30 DAY) ,'NEW','') AS `reg_new` ,`r`.`logdate` AS `reg_xdate` ,`u`.`name1` AS `user_name1` ,`u`.`name2` AS `user_name2` ,`c`.`name_en` AS `conf_name_en` FROM `c_reg` `r` INNER JOIN ( SELECT `iduser`, MAX(`logdate`) AS `reg_xdatemax` FROM `c_reg` WHERE `idconf`=4 GROUP BY `iduser` ) AS `ref` ON `ref`.`iduser`=`r`.`iduser` LEFT JOIN `c_user` `u` ON `u`.`iduser`=`r`.`iduser` LEFT JOIN `c_conf` `c` ON `c`.`idconf`=`r`.`idconf` -- LEFT JOIN `c_user` `aa` ON `aa`.`iduser`=`u`.`loguser` -- LEFT JOIN `c_user` `ba` ON `ba`.`iduser`=`r`.`loguser` WHERE `r`.`idconf`=4 ORDER BY `ref`.`reg_xdatemax` DESC, `u`.`name2` ASC, `u`.`name1` ASC, `r`.`logdate` DESC |
||
peta Profil |
Samozrejme to bylo tim
`idconf`=4 , protoze uz tam jsou zaznamy i novejsi konference, ktera nasleduje hned po ni s pribuznym tematem, tak jsou tam nekteri ti sami lide :) Vecer mne to taky napadlo a uz jsem se tesil, az to ted zkusim. Tez mne napadlo ,ze jsem nevhodne zvolil aliasy pro vnitrni tabulku, ze se to mozna prebiji s vnejsimi.
Ty 2 zakomentovane radky, to souvisi se zbytkem dotazu, ktery jsem odmazal. Ja tam pro kazdou tabulku uzivatele u, registrace r, konference c vedu zaznamy posledni zmeny. K tomu zaznamu u.logdate, r.logdate, c.logdate pak pridavam informaci u.name, kdo to naposledy menil. Takze, pri odmazani toho zbytku jsem to tam zapomnel smazat taky. Jo, proc INNER JOIN? |
||
Tori Profil |
peta:
„proc INNER JOIN“ Vlastně nevim. peta: ↓spokojen? :-p |
||
peta Profil |
#8 · Zasláno: 10. 10. 2013, 10:51:05
Keďže je slovensky :)
|
||
Kajman Profil |
#9 · Zasláno: 10. 10. 2013, 12:55:50
peta:
„proc INNER JOIN?“ Pokud jsou data taková, že vnitřní i vnější spojení vrátí stejné výsledky (což je i tento případ), bývá zpravidla rychlejší vnitřní (inner) spojení. Občas to může být i naopak, je to lepší změřit, ale v tomto případě tipuji na krapet svižnější variantu s inner joinem. |
||
peta Profil |
#10 · Zasláno: 10. 10. 2013, 14:19:45
Kajman: Mno, ja tam mam jen 55/75 zaznamu, takze cas je kolem 0.0053-0.0058 na localhost. Ok, dam tam INNER. Ale pro mne je to jen slovni rozdil, porad nechapu, co to presne dela na INNER a co na LEFT.
Tori: jo :) |
||
Tori Profil |
#11 · Zasláno: 11. 10. 2013, 17:28:14
peta:
„pro mne je to jen slovni rozdil, porad nechapu, co to presne dela na INNER a co na LEFT.“ Tím asi myslíte, co se děje uvnitř MySQL, že? Taky by mě to zajímalo. Vnější rozdíl je jednoduchý: INNER JOIN funguje jako podmínka s AND - ve výsledku budou pouze řádky vyskytující se v obou spojených tabulkách. Při LEFT JOIN tam budou všechny řádky z levé tabulky a k nim buď odpovídající sloupečky z pravé tabulky nebo NULL. |
||
Časová prodleva: 11 let
|
0