Fórum Root.cz

Hlavní témata => Server => Téma založeno: fuk 19. 01. 2018, 11:46:18

Název: MySQL - poskládání dotazu
Přispěvatel: fuk 19. 01. 2018, 11:46:18
Nevim si rady s dotazem do DB

Kód: [Vybrat]
+-------------+----------------------+---------------------+----+---------+
| 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

Název: Re:MYSQL - poskladani dotazu
Přispěvatel: SQL 19. 01. 2018, 11:56:13
Pokud jsem pochopil dobre tak tohle by mohlo stacit:

SELECT Name, details, MAX(date), id, flag FROM `table` GROUP BY Name;
Název: Re:MYSQL - poskladani dotazu
Přispěvatel: ZAJDAN 19. 01. 2018, 12:00:09
presne tak...pouzit
MAX(date)
Název: Re:MYSQL - poskladani dotazu
Přispěvatel: fuk 19. 01. 2018, 12:11:43
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" :/
Název: Re:MYSQL - poskladani dotazu
Přispěvatel: ZAJDAN 19. 01. 2018, 12:45:12
Vrati zaznamy pro John/Josh a nejnovejsi cas zaznamu, ale vraci neaktualni "details" :/
zkusil bych to bez GROUP BY
Název: Re:MYSQL - poskladani dotazu
Přispěvatel: fuk 19. 01. 2018, 13:09:08
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
Název: Re:MYSQL - poskladani dotazu
Přispěvatel: Sten 19. 01. 2018, 13:17:56
SELECT `Name`, `details`, `date`, `id`, `Flag` FROM `table` WHERE `Name` = "John" SORT BY `date` DESC LIMIT 1
Název: Re:MySQL - poskládání dotazu
Přispěvatel: Sten 19. 01. 2018, 13:25:46
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`
Název: Re:MySQL - poskládání dotazu
Přispěvatel: pepa 19. 01. 2018, 13:29:48
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.

Název: Re:MYSQL - poskladani dotazu
Přispěvatel: pepa 19. 01. 2018, 13:34:03
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.
Název: Re:MYSQL - poskladani dotazu
Přispěvatel: ZAJDAN 19. 01. 2018, 13:57:22
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)
Název: Re:MySQL - poskládání dotazu
Přispěvatel: ZAJDAN 19. 01. 2018, 14:26:28
Tohdle uz by mohlo uspokojit:
https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/8 (https://www.db-fiddle.com/f/fnCT7fvrx9yAHHDrXfxQJ1/8)
Název: Re:MySQL - poskládání dotazu
Přispěvatel: mmm 19. 01. 2018, 14:33:46
jste slepý? Sten ve druhém příspěvku uvedl opravené správné řešení.
Název: Re:MySQL - poskládání dotazu
Přispěvatel: ZAJDAN 19. 01. 2018, 14:39:39
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
Název: Re:MySQL - poskládání dotazu
Přispěvatel: mmm 19. 01. 2018, 14:41:06
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.
Název: Re:MySQL - poskládání dotazu
Přispěvatel: mmm 19. 01. 2018, 14:45:15
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.
Název: Re:MySQL - poskládání dotazu
Přispěvatel: ZAJDAN 19. 01. 2018, 14:52:07
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)
Název: Re:MySQL - poskládání dotazu
Přispěvatel: mmm 19. 01. 2018, 14:58:44
stenova odpověď je správně. Prostudujte si jí.
Název: Re:MySQL - poskládání dotazu
Přispěvatel: fuk 19. 01. 2018, 14:59:50
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
Název: Re:MySQL - poskládání dotazu
Přispěvatel: ZAJDAN 19. 01. 2018, 15:03:47
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
Název: Re:MySQL - poskládání dotazu
Přispěvatel: Sten 19. 01. 2018, 15:06:26
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.
Název: Re:MySQL - poskládání dotazu
Přispěvatel: mmm 19. 01. 2018, 15:07:13
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

Kód: [Vybrat]
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`;
Název: Re:MySQL - poskládání dotazu
Přispěvatel: ZAJDAN 19. 01. 2018, 15:11:19
...
mohl by jsi to prosim zkusit v tom dbfiddle? a postnout sem link
Název: Re:MySQL - poskládání dotazu
Přispěvatel: ZAJDAN 19. 01. 2018, 15:15:02
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
Název: Re:MySQL - poskládání dotazu
Přispěvatel: Sten 19. 01. 2018, 15:16:52
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 ;)
Název: Re:MySQL - poskládání dotazu
Přispěvatel: ZAJDAN 19. 01. 2018, 15:20:26
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
Kód: [Vybrat]
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 :_)
Název: Re:MySQL - poskládání dotazu
Přispěvatel: Kit 19. 01. 2018, 15:38:43
Tohle mi sice funguje, ale nejsem si jist, jestli je to správně:
Kód: [Vybrat]
SELECT * FROM (
        SELECT Name, details, datum, id, Flag FROM tabulka ORDER BY datum desc
    ) as t
    GROUP BY Name;
Název: Re:MySQL - poskládání dotazu
Přispěvatel: pepa 19. 01. 2018, 17:58:30
Tohle mi sice funguje, ale nejsem si jist, jestli je to správně:
Kód: [Vybrat]
SELECT * FROM (
        SELECT Name, details, datum, id, Flag FROM tabulka ORDER BY datum desc
    ) as t
    GROUP BY Name;

To není ani náhodou.
Název: Re:MySQL - poskládání dotazu
Přispěvatel: pepa 19. 01. 2018, 18:03:24
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.