Diskuze: Nejvyšší hodnota
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 28 zpráv z 28.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.


WHERE a = 2 AND MAX(c) = b
Něco takovýho by nešlo? 
Pochybuju, že to chápu dobře, ale myslím, že musí platit tyhle podmínky:
a == [nejaka tvoje hodnota, treba 2]
c > a
c == b
Maximální hodnota C se nerovná B. Potřebuju vrátit jen jeden nejvyšší řádek při hodnotě B.
b=2,c=3 // vrátí se
b=2,c=2 // nevrátí se
b=1, c=54 // vrátí se
b=1, c=43 // nevrátí se
Chápu tedy správně, že když b bude nabývat třeba třech
hodnot, vrátí se 3 řádky?
Tak něco takovýho?
SELECT nejake_sloupce
FROM tabulka
WHERE a = 2
GROUP BY b
HAVING MAX(c)
Tak se vyskytl problém, bere mi to pouze nejmenší "c", nikoli nejvyšší.
Zdá se mi to nelogické. 
SELECT MAX(c) FROM Tabulka WHERE a = něco GROUP BY b
To mi sice vyhodí nejvyšší "c", jenže ostatní data sloupce náleží nejmenší hodnotě "c". (Přidám-li za SELECT *)
to jsem nějak nepochopil. Co všechno se má vybrat a za jakých podmínek?
Vrátit se mají řádky se stejnou hodnotou "a". Každý vrácený řádek má jinou hodnotu "b", v databázi ale existují i další řádky se stejnou hodnotou "b", vybrat se má pouze jeden a to s nejvyšší hodnotou "c".
Problém je, že se mi vrací řádek s "c" nejmenší hodnotou. MAX(c) mi vrací v pohodě nevyšší hodnotu.
a toto ti vrátí co?
SELECT a, b, MAX(c) FROM Tabulka WHERE a = něco GROUP BY b
c b timestamp author a MAX(c)
3 8 2015-01-24 19:20:05 1 1 4
5 9 2015-01-25 08:54:57 1 1 6
Jak vidíš, hodnota c a MAX(c) se liší,
přestože by neměla.
Kód:
SELECT *, MAX(c) FROM version WHERE a = 1 GROUP BY b
a když nebudeš selectovat MAX(c), ale jen to dáš setřídit podle c (DESC) a dáš LIMIT 1?
To mi vyhodí jen jeden řádek. Pro každou hodnotu B potřebuju jeden řádek.
A toto? nevím, jestli to není blbost...
SELECT * FROM version WHERE ((a = 1) AND (c = MAX(c))) GROUP BY b
Ano, mám dojem, že je to blbost. Syntax error. 
Ještě mě napadla takováto šílenost...
SELECT * FROM version WHERE MAX(c) IN (SELECT MAX(c) FROM version WHERE (a=1) GROUP BY b)
Chyba v dotazu (1111): Invalid use of group function
Jestli se ale nepletu, ten dotaz s HAVING MAX by měl fungovat. Jenže SQL ten HAVING ignoruje.
Zkoušel jsem si to na localhostu a mně to vyhodilo správně podle
zadání.
Až se k tomu dostanu, ještě se na to podívám, ale je zvláštní, že ti to
bere to nejmenší.
Jelikož stále nedokážu zanalyzovat chybu, dám sem konkrétní zadání, snad na to někdo přijde...
Mám jeden článek, který má další podčlánky. Ty existují ve stejné
tabulce a odkazuje se na ně sloupcem parent. (Článek s id 1 bude
mít podčlánek se sloupcem parent = 1). Každý podčlánek má
ještě vlastní verze a já potřebuji vytáhnout pouze tu s nejvyšším ID
(nejnovější). Verze se slučují do jednoho řádku pomocí sloupce
article_id. (Existuje několik řádků dat se stejnou hodnotou
article_id. Potřebuji vytáhnout pouze jeden řádek s
nejvyšším id).
Testovací data:
id: 1
article_id: 1
parent: 1
id: 2
article_id: 1
parent: 1
id: 3
article_id: 2
parent: 1
id: 4
article_id: 2
parent: 1
Testovaný kód:
SELECT * FROM `version`
WHERE
`parent` = 1
GROUP BY `article_id`
HAVING MAX(`id`)
Očekávaný výstup:
id: 2
article_id: 1
parent: 1
id: 4
article_id: 2
parent: 1
Výstup, který se mi dostal:
id: 1
article_id: 1
parent: 1
id:3
article_id: 2
parent: 1
Jak vidíte, dostávají se mi řádky s nejmenší hodnotou id. Stejného výsledku dosáhnu absence HAVING MAX. Omlouvám se za detailnější analýzu, ale už si nevím rady.
SELECT * FROM `version`
WHERE `parent` = 1 AND id IN (
SELECT MAX(id) FROM version
GROUP BY article_id
)
GROUP BY `article_id`
Určitě bude snadnější řešení
Páni, budu se muset našprtat složitější dotazy než SELECT, UPDATE,
INSERT a DELETE.
Díky,
funguje. Body za odpověď jsem ti přidělil už výše. Kód mi přijde docela
složitý, bude to mít nějaký vliv na rychlost?
V podstatě se jen vyhledají všechna nejvyšší ID a nahází se do operátoru IN. Vliv na rychlost ti nedokážu říct, ale pokud tam nemáš miliony záznamů, nemělo by to mít prakticky žádný vliv.
Můžeš to zkusit ještě bez toho GROUP úplně dole.
Zobrazeno 28 zpráv z 28.