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.

Tvůrce

Zobrazeno 28 zpráv z 28.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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)
Vypadá to, že to funguje. Díky moc.
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.
Díky moc, jsem ti zavázán.
Zobrazeno 28 zpráv z 28.