Avatar
Inoue Yūki
Redaktor
Avatar
Inoue Yūki:

Zdravím! Je to trochu složitější, tak si dejme tabulku jako příklad s prvky:

a
b
c

A potřeboval bych, aby se mi vrátili všechny řádky se stejnou hodnotou "a" a zároveň nejvyšší hodnotou "c" při stejné hodnotě "b". Např.:

a:2, b:5, c:5 //toto se vrátí
a:2, b:5, c:4 // toto se nevrátí, nejvyšší hodnota c je 5
a:2, b:3, c:3 // toto se vrátí
a:2, b:3, c:1 // toto se nevrátí, nejvyšší hodnota c je 3
a:1, b:2, c:5 // toto se nevrátí, vrací se pouze řádky s hodnotou 2 v "a"

Lépe to vysvětlit neumím. :D Nemůžu na nic přijít. Nějaký nápad?

Odpovědět 24.1.2015 19:36
Avatar
Martin Konečný (pavelco1998):

WHERE a = 2 AND MAX(c) = b

Něco takovýho by nešlo? :D

 
Nahoru Odpovědět  +1 24.1.2015 19:43
Avatar
Matěj Kripner
Redaktor
Avatar
Odpovídá na Inoue Yūki
Matěj Kripner:

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
Nahoru Odpovědět 24.1.2015 19:47
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Inoue Yūki:

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
Nahoru Odpovědět 24.1.2015 19:57
Avatar
Odpovídá na Inoue Yūki
Martin Konečný (pavelco1998):

Chápu tedy správně, že když b bude nabývat třeba třech hodnot, vrátí se 3 řádky?

 
Nahoru Odpovědět 24.1.2015 19:59
Avatar
Martin Konečný (pavelco1998):

Tak něco takovýho?

SELECT nejake_sloupce
FROM tabulka
WHERE a = 2
GROUP BY b
HAVING MAX(c)
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 24.1.2015 20:04
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Inoue Yūki:

Vypadá to, že to funguje. Díky moc. :)

Nahoru Odpovědět  +1 24.1.2015 20:07
Avatar
Inoue Yūki
Redaktor
Avatar
Inoue Yūki:

Tak se vyskytl problém, bere mi to pouze nejmenší "c", nikoli nejvyšší. Zdá se mi to nelogické. :`

Nahoru Odpovědět 25.1.2015 8:57
Avatar
Odpovídá na Inoue Yūki
Michal Štěpánek:
SELECT MAX(c) FROM Tabulka WHERE a = něco GROUP BY b
Nahoru Odpovědět 25.1.2015 9:14
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Inoue Yūki:

To mi sice vyhodí nejvyšší "c", jenže ostatní data sloupce náleží nejmenší hodnotě "c". (Přidám-li za SELECT *)

Nahoru Odpovědět 25.1.2015 9:17
Avatar
Odpovídá na Inoue Yūki
Michal Štěpánek:

to jsem nějak nepochopil. Co všechno se má vybrat a za jakých podmínek?

Nahoru Odpovědět 25.1.2015 9:19
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Inoue Yūki:

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.

Nahoru Odpovědět 25.1.2015 9:28
Avatar
Odpovídá na Inoue Yūki
Michal Štěpánek:

a toto ti vrátí co?

SELECT a, b, MAX(c) FROM Tabulka WHERE a = něco GROUP BY b
Nahoru Odpovědět 25.1.2015 9:32
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Inoue Yūki:
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
Editováno 25.1.2015 9:34
Nahoru Odpovědět 25.1.2015 9:33
Avatar
Odpovídá na Inoue Yūki
Michal Štěpánek:

a když nebudeš selectovat MAX(c), ale jen to dáš setřídit podle c (DESC) a dáš LIMIT 1?

Nahoru Odpovědět 25.1.2015 9:37
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Inoue Yūki:

To mi vyhodí jen jeden řádek. Pro každou hodnotu B potřebuju jeden řádek.

Nahoru Odpovědět 25.1.2015 9:39
Avatar
Odpovídá na Inoue Yūki
Michal Štěpánek:

A toto? nevím, jestli to není blbost...

SELECT * FROM version WHERE ((a = 1) AND (c = MAX(c))) GROUP BY b
Nahoru Odpovědět 25.1.2015 9:41
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Inoue Yūki:

Ano, mám dojem, že je to blbost. Syntax error. :)

Nahoru Odpovědět 25.1.2015 9:44
Avatar
Michal Štěpánek:

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)
Nahoru Odpovědět 25.1.2015 9:47
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Michal Štěpánek
Inoue Yūki:

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.

Nahoru Odpovědět 25.1.2015 9:50
Avatar
Odpovídá na Inoue Yūki
Martin Konečný (pavelco1998):

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ší.

 
Nahoru Odpovědět 25.1.2015 12:01
Avatar
Inoue Yūki
Redaktor
Avatar
Inoue Yūki:

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.

Editováno 26.1.2015 13:18
Nahoru Odpovědět 26.1.2015 13:16
Avatar
Odpovídá na Inoue Yūki
Martin Konečný (pavelco1998):
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í

Editováno 26.1.2015 13:34
 
Nahoru Odpovědět 26.1.2015 13:32
Avatar
Inoue Yūki
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Inoue Yūki:

Páni, budu se muset našprtat složitější dotazy než SELECT, UPDATE, INSERT a DELETE. :D 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?

Nahoru Odpovědět 26.1.2015 13:37
Avatar
Odpovídá na Inoue Yūki
Martin Konečný (pavelco1998):

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.

 
Nahoru Odpovědět 26.1.2015 13:42
Avatar
Inoue Yūki
Redaktor
Avatar
Nahoru Odpovědět 26.1.2015 13:44
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 28 zpráv z 28.