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
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
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
(doufam, ze dotaz je kompletni, protoze jsem z nej odmazaval komentare)
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
Snad to bude fungovat. edit: doplnila jsem ID konference do poddotazu.
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. Keďže Jelikož v obou dotazech je omezení na ID konference, tak nejspíš bude výsledek stejný s INNER i LEFT joiny.

peta: ↓spokojen? :-p
peta
Profil
Keďže je slovensky :)
Kajman
Profil
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
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
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.

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: