Zadejte hledaný výraz...
Jakub Glos
Webtrh.cz
Vývoj webových stránek na WordPressu a proklientský přístup pro freelancery
Třídenní infromacemi nabitý prezenční + online kurz v Praze od Webtrhu pouze za 2 871 Kč
Více informací

Mysql – dotaz přes 2 tabulky, vyloučení stejných id

alibagil
verified
rating uzivatele
17. 11. 2021 10:48:46
Zdravím, potřeboval bych poradit, protože se s tím trápím a nemohu na to přijít.
Mám 2 tabulky. Jedna je "objednavky", která má několik sloupců, ale potřebuji z ní vzít jen "id_objednavky".
A potom mám tabulku polozkyobjednavky, kde jsou sloupce id, id_objednavky, termin.
Ten zápis v ní je třeba takový: 
id          id_objednavky          termin
1          1                                    2021-11-15
2          1                                    2021-11-18
3          1                                    2021-11-17
4          2                                    2021-11-20
5          2                                    2021-11-19
6          3                                    2021-11-18
Potřebuji udělat dotaz, který mi vrátí id_objednavky a termin, podle kterého chci následně řadit, ale vždy pouze unikátní a vždy pouze s termínem, který je pro danou objednávku v zápisu jako poslední.
Výsledkem dotazu by mělo být:
id_objednavky          termin
1                                   2021-11-17
2                                   2021-11-19
3                                   2021-11-18
Napadlo mě samozřejmě využít JOIN a GROUP BY, což má téměř správný efekt, ale vrací nejvyšší termín v zápisu, což není správné. Kód nějak takto:
Zkusil jsem to i přes subquery, nějak takto: 
Ale to je špatně, protože jednak nejde použít LIMIT a hlavně by mi ve výstupu scházela položka termin.
Prosím poraďte. Řekl bych, že to bude nějaká kombinace obou možností, ale jsem na to krátký :-(
17. 11. 2021 10:48:46
https://webtrh.cz/diskuse/mysql-dotaz-pres-2-tabulky-vylouceni-stejnych-id/#reply1494053
TomasX
verified
rating uzivatele
(4 hodnocení)
17. 11. 2021 11:20:40
Mysql je v tomhle trochu nedospělá databáze, ale umožňuje tyhle dotazy napsat poměrně jednoduše:
Having ti dělá filtrování výsledků po group by, tady tedy vyfiltrujeme pouze řádky, kde je max(id), tj. poslední vložený záznam, předpokládám, že ten sloupec id je auto increment a nikdy nedokází k úpravě záznamů zpětně.
Od mysql 8.0 nebo v dospělých databázích se používají window funkce:
Pozn.: u joinu je v tomhle případě jedno jestli použiješ ON nebo USING
17. 11. 2021 11:20:40
https://webtrh.cz/diskuse/mysql-dotaz-pres-2-tabulky-vylouceni-stejnych-id/#reply1494052
alibagil
verified
rating uzivatele
17. 11. 2021 12:35:53
WOOW, to je přesně to, co jsem potřeboval!!! DÍKY MOC!
---------- Příspěvek doplněn 17.11.2021 v 14:05 ----------
A tak je tam ještě někde chybka, použil jsem tvůj druhý kód na lokálu a tam to funguje, jak potřebuji, ale na serveru to vyhazuje chybu: #1064 - Vaše syntaxe je nějaká divná blízko '(PARTITION BY objednavky.id_objednavky ORDER BY polozkyobjednavky.id DESC) as te' na řádku 2
A na řádku: 
Při analýze bylo nalezeno 3 chyb.
An alias was previously found. (near "termin" at position 146)
An alias was expected. (near " " at position 145)
Unexpected token. (near "termin" at position 146)
Můžeš na to prosím ještě mrknout? Na lokálu mám 10.4.10-MariaDB a na serveru 10.0.36-MariaDB-0+deb8u1, tak nevím, jestli to nemůže být tím.
17. 11. 2021 12:35:53
https://webtrh.cz/diskuse/mysql-dotaz-pres-2-tabulky-vylouceni-stejnych-id/#reply1494051
TomasX
verified
rating uzivatele
(4 hodnocení)
17. 11. 2021 17:19:16
Mariadb podporuje window funkce až od verze 10.2, použij tedy tu první variantu.
17. 11. 2021 17:19:16
https://webtrh.cz/diskuse/mysql-dotaz-pres-2-tabulky-vylouceni-stejnych-id/#reply1494050
alibagil
verified
rating uzivatele
17. 11. 2021 17:32:05
Zkusil jsem, ale tam je taky nějaká chyba: #1064 - Vaše syntaxe je nějaká divná blízko '= polozkyobjednavky.id LIMIT 0, 25' na řádku 1
17. 11. 2021 17:32:05
https://webtrh.cz/diskuse/mysql-dotaz-pres-2-tabulky-vylouceni-stejnych-id/#reply1494049
TomasX
verified
rating uzivatele
(4 hodnocení)
17. 11. 2021 18:13:39
pravda, 10.0.36 je už opravdu stará verze, u having nepodporuje dynamické hodnoty, takže dotaz je nutné přepsat na subselect např. takhle:
Dodatek: ta chyba syntaxe odkazuje ještě na jiný neduh v 10.0.36, u having nepodporuje ==, ale pouze =. Ty sql nezkouším. Je dobré příště uvést verzi mysql/mariadb rovnou, zejména pokud máš takhle starou.
17. 11. 2021 18:13:39
https://webtrh.cz/diskuse/mysql-dotaz-pres-2-tabulky-vylouceni-stejnych-id/#reply1494048
alibagil
verified
rating uzivatele
17. 11. 2021 18:30:56
Teď to maká přesně jak má. Fakt ještě jednou DÍKY MOC!!! Jsi machr.
17. 11. 2021 18:30:56
https://webtrh.cz/diskuse/mysql-dotaz-pres-2-tabulky-vylouceni-stejnych-id/#reply1494047
Nishkam
verified
rating uzivatele
(3 hodnocení)
18. 11. 2021 16:59:21
A proc JOIN-ovat 2 tabulky, kdyz vsechny potrebne polozky jsou v 1 tabulce polozkyobjednavky?
18. 11. 2021 16:59:21
https://webtrh.cz/diskuse/mysql-dotaz-pres-2-tabulky-vylouceni-stejnych-id/#reply1494046
TomasX
verified
rating uzivatele
(4 hodnocení)
18. 11. 2021 17:43:11
v tomhle případě je zbytečné to joinování, ale předpokládám, že reálný dotaz může obsahovat i další sloupce, zároveň jsem chtěl ukázat ten algoritmus i s joinováním.
Pokud není potřeba sloupce z hlavní tabulky, stačí použít jen ten subselect z posledního příkladu.
18. 11. 2021 17:43:11
https://webtrh.cz/diskuse/mysql-dotaz-pres-2-tabulky-vylouceni-stejnych-id/#reply1494045
Pro odpověď se přihlašte.
Přihlásit