Autor | Zpráva | ||
---|---|---|---|
ferda999 Profil |
#1 · Zasláno: 20. 11. 2023, 12:04:36
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 |
#2 · Zasláno: 20. 11. 2023, 12:28:09
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 |
#3 · Zasláno: 20. 11. 2023, 13:23:18
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 |
#4 · Zasláno: 20. 11. 2023, 13:28:03
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 |
#5 · Zasláno: 20. 11. 2023, 14:03:04
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 |
#6 · Zasláno: 20. 11. 2023, 15:46:54
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. |
||
Časová prodleva: 4 dny
|
|||
ferda999 Profil |
#7 · Zasláno: 24. 11. 2023, 08:40:14
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 |
#8 · Zasláno: 24. 11. 2023, 10:55:57
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 |
#9 · Zasláno: 24. 11. 2023, 11:56:52
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 |
#10 · Zasláno: 24. 11. 2023, 13:44:55
Tak už nic, už jsem to vyřešil. Děkuji
|
||
Kajman Profil |
#11 · Zasláno: 24. 11. 2023, 15:32:42
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 |
#12 · Zasláno: 25. 11. 2023, 07:16:15
OK, děkuji za upozornění, ještě naštuduji a upravím.
|
||
Časová prodleva: 10 měsíců
|
0