Autor Zpráva
ferda999
Profil
Ahoj, prosím, jak udělat výběr z dvou tabulek, aby se z druhé vybral jen poslední záznam dle podmínek. viz.

SELECT t1.*, t2.datumc FROM tabulka1 t1 LEFT JOIN tabulka2 t2 ON (t1.id=t2.id) WHERE (t2.name='pokus' AND t2.cislo=999) a tady, aby se vybral jen poslední záznam dle datumu vytvoření datumc jako ORDER BY datumc DESC LIMIT 0,1 a když se nic nenajde tak t2.datumc bude NULL

Děkuji za radu
Kajman
Profil
Mělo by to jít podle třetího příkladu z
Některé časteji řešené dotazy pro MySQL - FAQ » Nalezení řádků s maximální (minimální) hodnotou
tedy nají vždy nejvyšší datumc a podle toho pak dolinkovat řádek s ostatními sloupci.
ferda999
Profil
Děkuji za radu, ale nějak to nemohu sestavit
z tabulky1 chci ke každému záznamu dle id z tabulky2 ziskat datum posledního vytvořeného záznamu vybraného dle podmínky name a cislo. Jestliže záznam v tabulce nenalezen, pak vrací u id položku datumc=NULL
Kajman
Profil
Tak pokud stačí jen datum a nejsou potřeba jiné sloupce z tabulka2, tak to je jednoduché a můžete použít i korelovaný poddotaz.

SELECT t1.*,
       (SELECT Max(t2.datumc)
        FROM   tabulka2 t2
        WHERE ( t1.id = t2.id
                AND t2.name = 'pokus'
                AND t2.cislo = 999 )) datumc
FROM   tabulka1 t1 
ferda999
Profil
Paráda, moc děkuji, to je přesně ono,... jestli mohu, ještě přidám jednu podminku ... poslední záznam se dle podmínek name a cislo vybere, jen když je t2.typ=1 (jestliže je ale typ=0 pak také NULL). To se řeší pomocí GROUP BY ? Děkuji
Kajman
Profil
To už tedy potřebujete další sloupec z tabulka2 a už to nejde dělat takto jednoduše a je to potřeba udělat např. dle FAQ. Zkuste něco jako

SELECT t1.*,
       t2.datumc
FROM   tabulka1 t1
       LEFT JOIN (SELECT t21.*
                  FROM   tabulka2 t21
                         JOIN (SELECT t22.id,
                                      Max(t22.datumc) datumc
                               FROM   tabulka2 t22
                               WHERE  t22.name = 'pokus'
                                      AND t22.cislo = 999
                               GROUP  BY t22.id) t23
                           ON t21.id = t23.id
                              AND t21.datumc = t23.datumc) t2
              ON t1.id = t2.id
                 AND t2.typ = 1

Pokud v druhé tabulce je ale možnost mít maximální datum vícekrát pro jedno id, mohou se pak řádky z první tabulky znásobit. V tomto případě by šlo tomu zamezit slovem DISTINCT za prvním SELECT. Nebo to napsat pomocí window funkcí, pokud to je novější verze mysql nebo mariadb.
ferda999
Profil
Děkuji, tak jsem to sestavil a je to OK.

Měl bych ještě jeden dotaz ohledně selectu, a to vždy ze stejné tabulky např. se sloupci uid, key, keys
2 AAA AAA,BBB
3 CCC CCC
4 BBB BBB,AAA
5 XXX XXX
6 EEE AAA,BBB

potřebuji výpis uid kde vstupem uid např. 4 a keys obsahuje daný key BBB tzn. zde by to bylo 2,4,6 (kdyby výstupem bylo přímo takto 2,4,6 bylo by to nejlepší). Moc děkuji za radu
Kajman
Profil
Ta tabulka porušuje normální formy. Data z keys by měla být v další vazební tabulce, kde každý klíč je na jiném řádku.

Spojit tabulku samu se sebou není žádný problém. I v tom příkladě výše se tak dělo. Jen musíte pomocí aliasu rozlišit jednotlivá použití stejné tabulky. Takže z jednoho aliasu vyzobnete řádek 4 a spojíte s druhým aliesem podle podmínky, že keys obsahuje key z prvního aliasu. Kdyby to zlobilo, napište, k čemu jste došel.
ferda999
Profil
No, něco jsem slepil a vrací to požadované řádky 2,4,6 ... a lze to tedy ještě nějak udělat, aby se vracela jen uid v jednom výsledku v tomto formátu 2,4,6 ?
SELECT t21.* FROM table t21 JOIN (SELECT t22.uid, t22.key FROM table t22 WHERE t22.uid = 4) t22 ON t21.keys LIKE CONCAT('%',t22.key,'%');
ferda999
Profil
Tak už nic, už jsem to vyřešil. Děkuji
Kajman
Profil
To like nebude fungovat dobře, najde to i podstringy. Tedy při hledání AA to najde i pokud je v keys AAB. Jistější je použít odkázané FIND_IN_SET. Spojovat se dá pomocí funkce GROUP_CONCAT, ale moc se to na této vrstvě nedělá.
ferda999
Profil
OK, děkuji za upozornění, ještě naštuduji a upravím.

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:

0