MySQL - poskládání dotazu

fuk

MySQL - poskládání dotazu
« kdy: 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



SQL

Re:MYSQL - poskladani dotazu
« Odpověď #1 kdy: 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;

ZAJDAN

  • *****
  • 2 110
Re:MYSQL - poskladani dotazu
« Odpověď #2 kdy: 19. 01. 2018, 12:00:09 »
presne tak...pouzit
MAX(date)
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

fuk

Re:MYSQL - poskladani dotazu
« Odpověď #3 kdy: 19. 01. 2018, 12:11:43 »
Citace od: SQL kdy 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;


Vrati zaznamy pro John/Josh a nejnovejsi cas zaznamu, ale vraci neaktualni "details" :/

ZAJDAN

  • *****
  • 2 110
Re:MYSQL - poskladani dotazu
« Odpověď #4 kdy: 19. 01. 2018, 12:45:12 »
Citace od: fuk kdy 19. 01. 2018, 12:11:43
Vrati zaznamy pro John/Josh a nejnovejsi cas zaznamu, ale vraci neaktualni "details" :/
zkusil bych to bez GROUP BY
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.


fuk

Re:MYSQL - poskladani dotazu
« Odpověď #5 kdy: 19. 01. 2018, 13:09:08 »
Citace od: ZAJDAN kdy 19. 01. 2018, 12:45:12
Citace od: fuk kdy 19. 01. 2018, 12:11:43
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

Sten

Re:MYSQL - poskladani dotazu
« Odpověď #6 kdy: 19. 01. 2018, 13:17:56 »
SELECT `Name`, `details`, `date`, `id`, `Flag` FROM `table` WHERE `Name` = "John" SORT BY `date` DESC LIMIT 1

Sten

Re:MySQL - poskládání dotazu
« Odpověď #7 kdy: 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`

pepa

Re:MySQL - poskládání dotazu
« Odpověď #8 kdy: 19. 01. 2018, 13:29:48 »
Citace od: Sten kdy 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`


Pripadně pokud ten sloupeček id je id záznamu tak vyuřít to id.


pepa

Re:MYSQL - poskladani dotazu
« Odpověď #9 kdy: 19. 01. 2018, 13:34:03 »
Citace od: SQL kdy 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;

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.

ZAJDAN

  • *****
  • 2 110
Re:MYSQL - poskladani dotazu
« Odpověď #10 kdy: 19. 01. 2018, 13:57:22 »
Citace od: Sten kdy 19. 01. 2018, 13:17:56
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
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

ZAJDAN

  • *****
  • 2 110
Re:MySQL - poskládání dotazu
« Odpověď #11 kdy: 19. 01. 2018, 14:26:28 »
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

mmm

Re:MySQL - poskládání dotazu
« Odpověď #12 kdy: 19. 01. 2018, 14:33:46 »
jste slepý? Sten ve druhém příspěvku uvedl opravené správné řešení.

ZAJDAN

  • *****
  • 2 110
Re:MySQL - poskládání dotazu
« Odpověď #13 kdy: 19. 01. 2018, 14:39:39 »
Citace od: mmm kdy 19. 01. 2018, 14:33:46
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
Vesele, vesele do továrny dělník běží...vesele, vesele do továrny jde. Vesele se usmívá když mu soustruh zazpívá...vesele, vesele do továrny jde. Vesele si poskočí když se soustruh roztočí ...vesele, vesele do továrny jde.

mmm

Re:MySQL - poskládání dotazu
« Odpověď #14 kdy: 19. 01. 2018, 14:41:06 »
Citace od: ZAJDAN kdy 19. 01. 2018, 14:39:39
Citace od: mmm kdy 19. 01. 2018, 14:33:46
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.