Fórum Root.cz
Hlavní témata => Server => Téma založeno: fuk 19. 01. 2018, 11:46:18
-
Nevim si rady s dotazem do DB
+-------------+----------------------+---------------------+----+---------+
| Name |details| date | id | Flag |
+-------------+----------------------+---------------------+----+---------+
| John | TEST | 2018-01-19 10:45:13 | 1 | OK |
| John | TEST | 2018-01-19 10:49:49 | 2 | OK |
| John | TEST | 2018-01-19 10:49:51 | 3 | OK |
| John | TEST | 2018-01-19 11:10:16 | 4 | OK |
| John | TEST | 2018-01-19 11:11:40 | 5 | OK |
| John | TEST | 2018-01-19 11:15:56 | 6 | OK |
| Josh | TEST2| 2018-01-19 11:17:34 | 7 | OK |
| Josh | TEST2| 2018-01-19 11:18:10 | 8 | OK |
+-------------+----------------------+---------------------+----+---------+
8 rows in set (0.00 sec)
Nad touto tabulku potrebuji udelat distinct pro "Name" a vybrat zaznam s nejnovejsim "date" pro kazdou polozku distinct. Muzu to udelat sice v primo ve skriptu, ale chtel bych to dostat rovnou z DB
-
Pokud jsem pochopil dobre tak tohle by mohlo stacit:
SELECT Name, details, MAX(date), id, flag FROM `table` GROUP BY Name;
-
presne tak...pouzit
MAX(date)
-
Pokud jsem pochopil dobre tak tohle by mohlo stacit:
SELECT Name, details, MAX(date), id, flag FROM `table` GROUP BY Name;
Vrati zaznamy pro John/Josh a nejnovejsi cas zaznamu, ale vraci neaktualni "details" :/
-
Vrati zaznamy pro John/Josh a nejnovejsi cas zaznamu, ale vraci neaktualni "details" :/
zkusil bych to bez GROUP BY
-
Vrati zaznamy pro John/Josh a nejnovejsi cas zaznamu, ale vraci neaktualni "details" :/
zkusil bych to bez GROUP BY
To zase vrati vsechny vysledky v DB
-
SELECT `Name`, `details`, `date`, `id`, `Flag` FROM `table` WHERE `Name` = "John" SORT BY `date` DESC LIMIT 1
-
Jo, pro každou položku:
SELECT `Name`, `details`, `date`, `id`, `Flag`
FROM `table`
INNER JOIN (
SELECT `Name`, MAX(`date`) AS `maxDate`
FROM `table`
GROUP BY `Name`
) `grouped`
ON `table`.`Name` = `grouped`.`Name` AND `table`.`date` = `grouped`.`maxDate`
-
Jo, pro každou položku:
SELECT `Name`, `details`, `date`, `id`, `Flag`
FROM `table`
INNER JOIN (
SELECT `Name`, MAX(`date`) AS `maxDate`
FROM `table`
GROUP BY `Name`
) `grouped`
ON `table`.`Name` = `grouped`.`Name` AND `table`.`date` = `grouped`.`maxDate`
Pripadně pokud ten sloupeček id je id záznamu tak vyuřít to id.
-
Pokud jsem pochopil dobre tak tohle by mohlo stacit:
SELECT Name, details, MAX(date), id, flag FROM `table` GROUP BY Name;
Bohužel todle fungovalo tak před 5 roky možná více a navíc to musel být mysql, máriadb ta už to také sypala jinak.
Jo jo dokud dotaz do databáze zpracovávalo jedno vlákno dalo se spolehnout na ledacos i na to co neodpovídá specifikaci.
-
SELECT `Name`, `details`, `date`, `id`, `Flag` FROM `table` WHERE `Name` = "John" SORT BY `date` DESC LIMIT 1
jen tak z hecu to zkousim, ale nedari se:
https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/7 (https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/7)
-
Tohdle uz by mohlo uspokojit:
https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/8 (https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/8)
-
jste slepý? Sten ve druhém příspěvku uvedl opravené správné řešení.
-
jste slepý? Sten ve druhém příspěvku uvedl opravené správné řešení.
schvalně si to na tom fiddlu zkus, zda Ti to bude fungovat...
každopádně si myslím, že není potřeba joinovat a stačilo by co jsem posilal
-
jste slepý? Sten ve druhém příspěvku uvedl opravené správné řešení.
schvalně si to na tom fiddlu zkus, zda Ti to bude fungovat...
každopádně si myslím, že není potřeba joinovat a stačilo by co jsem posilal
omlouvám se, já jsem myslel, že jste tazatel.
-
jste slepý? Sten ve druhém příspěvku uvedl opravené správné řešení.
schvalně si to na tom fiddlu zkus, zda Ti to bude fungovat...
každopádně si myslím, že není potřeba joinovat a stačilo by co jsem posilal
on chce pro každé jméno řádek s maxmálním datumem. Ten váš dotaz vrátí jen řádky s maxmálním datumem z celé tabulky.
-
on chce pro každé jméno řádek s maxmálním datumem. Ten váš dotaz vrátí jen řádky s maxmálním datumem z celé tabulky.
OMG...tak si do primarniho SELECTU prida Name a co potrebuje
https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/10 (https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/10)
-
stenova odpověď je správně. Prostudujte si jí.
-
Jo, pro každou položku:
SELECT `Name`, `details`, `date`, `id`, `Flag`
FROM `table`
INNER JOIN (
SELECT `Name`, MAX(`date`) AS `maxDate`
FROM `table`
GROUP BY `Name`
) `grouped`
ON `table`.`Name` = `grouped`.`Name` AND `table`.`date` = `grouped`.`maxDate`
Dekuji!!!! to je presne ono
-
stenova odpověď je správně. Prostudujte si jí.
jiz jsem zkousel v dbfiddle ale neuspesne
a to co jsem postoval, udela presne to co zadatel chce
-
jen tak z hecu to zkousim, ale nedari se:
https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/7 (https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/7)
To bude tím, že zkoušíte jiný dotaz ;) Máte tam GROUP BY, já tam mám SORT BY.
schvalně si to na tom fiddlu zkus, zda Ti to bude fungovat...
každopádně si myslím, že není potřeba joinovat a stačilo by co jsem posilal
Nestačilo. Uživatelé John a Josh mají každý jiná data.
-
stenova odpověď je správně. Prostudujte si jí.
jiz jsem zkousel v dbfiddle ale neuspesne
a to co jsem postoval, udela presne to co zadatel chce
SELECT test.*
FROM `test`
INNER JOIN (
SELECT `Name`, MAX(`date`) AS `maxDate`
FROM `test`
GROUP BY `Name`
) `grouped`
ON `test`.`Name` = `grouped`.`Name` AND `test`.`date` = `grouped`.`maxDate`;
-
...
mohl by jsi to prosim zkusit v tom dbfiddle? a postnout sem link
-
Nestačilo. Uživatelé John a Josh mají každý jiná data.
pravda, nevsiml jsem si ze u obouch jsem dal v mem testu stejne datetime
-
OMG...tak si do primarniho SELECTU prida Name a co potrebuje
https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/10 (https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/10)
Subquery je interně taky INNER JOIN ;)
-
Subquery je interně taky INNER JOIN ;)
:) dík za info...jinak už jsem přišel na to proč mi ten tvuj dotaz v dbfiddle nefachcil, bylo potreba pred sloupec Name doplnit tabulku
SELECT test.Name, details, date, id, Flag
FROM test
INNER JOIN (
SELECT test.Name, MAX(date) AS maxDate
FROM test
GROUP BY Name
) AS grouped
ON test.Name = grouped.Name AND test.date = grouped.maxDate
;
tak tazateli a Stenovi dekuji, že jsem se zas něco přiučil...díky :_)
-
Tohle mi sice funguje, ale nejsem si jist, jestli je to správně:
SELECT * FROM (
SELECT Name, details, datum, id, Flag FROM tabulka ORDER BY datum desc
) as t
GROUP BY Name;
-
Tohle mi sice funguje, ale nejsem si jist, jestli je to správně:
SELECT * FROM (
SELECT Name, details, datum, id, Flag FROM tabulka ORDER BY datum desc
) as t
GROUP BY Name;
To není ani náhodou.
-
Smiřte se s tím správně je ta varianta s JOIN a ještě Vám prozradím malé tajemství ORDER BY bude fungovat jen až po JOIN pokud ho provedete v tom selectu kde je group by tak se to ven nespropaguje. A opět ano kdysi by to fungovalo, ale doba se mění a programátoři databází využívají vlákna a více a ty více cpu jednotek a tím pádem jsou výsledky jiné než když dotaz běžel v jednom vlákně. Ale stále jsou zprávně co se popisu SQL týká. Na podobných dotazech po aktulizaci databáze už sleťela nejedna starší aplikace.