Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Neaktivní uživatel:24.1.2015 19:36

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
Neaktivní uživatelský účet
Avatar
Martin Konečný (pavelco1998):24.1.2015 19:43

WHERE a = 2 AND MAX(c) = b

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

Nahoru Odpovědět
24.1.2015 19:43
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Matěj Kripner
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Matěj Kripner:24.1.2015 19:47

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
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:24.1.2015 19:57

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
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Konečný (pavelco1998):24.1.2015 19:59

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Nahoru Odpovědět
24.1.2015 20:03
Neaktivní uživatelský účet
Avatar
Martin Konečný (pavelco1998):24.1.2015 20:04

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
24.1.2015 20:04
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:24.1.2015 20:07

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

Nahoru Odpovědět
24.1.2015 20:07
Neaktivní uživatelský účet
Avatar
Neaktivní uživatel:25.1.2015 8:57

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
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Michal Štěpánek:25.1.2015 9:14
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
Odpovídá na Michal Štěpánek
Neaktivní uživatel:25.1.2015 9:17

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
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Michal Štěpánek:25.1.2015 9:19

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
Odpovídá na Michal Štěpánek
Neaktivní uživatel:25.1.2015 9:28

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
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Michal Štěpánek:25.1.2015 9:32

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
Odpovídá na Michal Štěpánek
Neaktivní uživatel:25.1.2015 9:33
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
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Michal Štěpánek:25.1.2015 9:37

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
Odpovídá na Michal Štěpánek
Neaktivní uživatel:25.1.2015 9:39

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

Nahoru Odpovědět
25.1.2015 9:39
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Michal Štěpánek:25.1.2015 9:41

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
Odpovídá na Michal Štěpánek
Neaktivní uživatel:25.1.2015 9:44

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

Nahoru Odpovědět
25.1.2015 9:44
Neaktivní uživatelský účet
Avatar
Michal Štěpánek:25.1.2015 9:47

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
Odpovídá na Michal Štěpánek
Neaktivní uživatel:25.1.2015 9:50

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
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Konečný (pavelco1998):25.1.2015 12:01

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Neaktivní uživatel:26.1.2015 13:16

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
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Konečný (pavelco1998):26.1.2015 13:32
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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:26.1.2015 13:37

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
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Martin Konečný (pavelco1998):26.1.2015 13:42

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
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Neaktivní uživatel:26.1.2015 13:44

Díky moc, jsem ti zavázán. ;) :)

Nahoru Odpovědět
26.1.2015 13:44
Neaktivní uživatelský účet
Avatar
Nahoru Odpovědět
26.1.2015 14:40
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
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.