简体   繁体   中英

Mysql / Select / MAX() / GROUP BY

Here the structure of the database (reduced):

CREATE TABLE IF NOT EXISTS `TK_servers` (
  `id` int(11),
  `server_id` varchar(11) ,
  `worker_id` varchar(20) ,
  `date_ins` datetime ,
  `avg` varchar(10)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1  ;

INSERT INTO `TK_servers` (`id`, `server_id`, `worker_id`, `date_ins`, `avg`)
VALUES
(108253, 12, 'srva', '2014-04-10 12:00:31', ''),
(108250, 31, 'srva', '2014-04-10 12:00:31', '2.337'),
(108249, 19, 'srva', '2014-04-10 12:00:31', '5.883'),
(108248, 10, 'srva', '2014-04-10 12:00:31', '8.813'),
(108223, 12, 'srvb', '2014-04-10 12:00:22', ''),
(108220, 31, 'srvb', '2014-04-10 12:00:22', '31.183'),
(108219, 19, 'srvb', '2014-04-10 12:00:22', '34.412'),
(108218, 10, 'srvb', '2014-04-10 12:00:22', '36.724'),
(108193, 12, 'srva', '2014-04-10 11:55:31', ''),
(108190, 31, 'srva', '2014-04-10 11:55:31', '2.500'),
(108189, 19, 'srva', '2014-04-10 11:55:31', '5.835'),
(108188, 10, 'srva', '2014-04-10 11:55:31', '8.883'),
(108163, 12, 'srvb', '2014-04-10 11:55:23', ''),
(108160, 31, 'srvb', '2014-04-10 11:55:23', '30.766'),
(108159, 19, 'srvb', '2014-04-10 11:55:23', '42.801'),
(108158, 10, 'srvb', '2014-04-10 11:55:23', '37.093'),
(108133, 12, 'srva', '2014-04-10 11:50:31', ''),
(108130, 31, 'srva', '2014-04-10 11:50:31', '2.538'),
(108129, 19, 'srva', '2014-04-10 11:50:31', '5.397'),
(108128, 10, 'srva', '2014-04-10 11:50:31', '8.737'),
(108103, 12, 'srvb', '2014-04-10 11:50:22', ''),
(108099, 31, 'srvb', '2014-04-10 11:50:22', '30.948'),
(108098, 19, 'srvb', '2014-04-10 11:50:22', '34.279'),
(108097, 10, 'srvb', '2014-04-10 11:50:22', '36.418'),
(108073, 12, 'srva', '2014-04-10 11:45:32', ''),
(108070, 31, 'srva', '2014-04-10 11:45:32', '2.502'),
(108069, 19, 'srva', '2014-04-10 11:45:32', '5.568'),
(108068, 10, 'srva', '2014-04-10 11:45:32', '9.202'),
(108043, 12, 'srvb', '2014-04-10 11:45:22', ''),
(108041, 19, 'srvb', '2014-04-10 11:45:22', '46.626'),
(108039, 31, 'srvb', '2014-04-10 11:45:22', '30.827'),
(108038, 10, 'srvb', '2014-04-10 11:45:22', '37.197'),
(108013, 12, 'srva', '2014-04-10 11:40:32', ''),
(108010, 31, 'srva', '2014-04-10 11:40:32', '2.604'),
(108009, 19, 'srva', '2014-04-10 11:40:32', '5.252'),
(108008, 10, 'srva', '2014-04-10 11:40:32', '8.816'),
(107983, 12, 'srvb', '2014-04-10 11:40:22', ''),
(107980, 31, 'srvb', '2014-04-10 11:40:22', '31.632'),
(107979, 19, 'srvb', '2014-04-10 11:40:22', '43.913'),
(107978, 10, 'srvb', '2014-04-10 11:40:22', '36.796'),
(107953, 12, 'srva', '2014-04-10 11:35:32', ''),
(107950, 31, 'srva', '2014-04-10 11:35:32', '2.369'),
(107949, 19, 'srva', '2014-04-10 11:35:32', '5.876'),
(107948, 10, 'srva', '2014-04-10 11:35:32', '8.721'),
(107923, 12, 'srvb', '2014-04-10 11:35:23', ''),
(107920, 31, 'srvb', '2014-04-10 11:35:23', '31.595'),
(107919, 19, 'srvb', '2014-04-10 11:35:23', '45.858'),
(107918, 10, 'srvb', '2014-04-10 11:35:23', '36.661'),
(107893, 12, 'srva', '2014-04-10 11:30:31', ''),
(107890, 31, 'srva', '2014-04-10 11:30:31', '2.508'),
(107889, 19, 'srva', '2014-04-10 11:30:31', '6.308'),
(107888, 10, 'srva', '2014-04-10 11:30:31', '38.151'),
(107863, 12, 'srvb', '2014-04-10 11:30:23', ''),
(107860, 31, 'srvb', '2014-04-10 11:30:23', '31.162'),
(107859, 19, 'srvb', '2014-04-10 11:30:23', '34.515'),
(107858, 10, 'srvb', '2014-04-10 11:30:23', '36.720'),
(107833, 12, 'srva', '2014-04-10 11:25:31', ''),
(107830, 31, 'srva', '2014-04-10 11:25:31', '2.722'),
(107829, 19, 'srva', '2014-04-10 11:25:31', '5.965'),
(107828, 10, 'srva', '2014-04-10 11:25:31', '8.642'),
(107803, 12, 'srvb', '2014-04-10 11:25:23', ''),
(107799, 31, 'srvb', '2014-04-10 11:25:23', '31.525'),
(107798, 19, 'srvb', '2014-04-10 11:25:23', '34.465'),
(107797, 10, 'srvb', '2014-04-10 11:25:23', '36.893'),
(107773, 12, 'srva', '2014-04-10 11:20:30', ''),
(107770, 31, 'srva', '2014-04-10 11:20:30', '2.373'),
(107769, 19, 'srva', '2014-04-10 11:20:30', '5.206'),
(107768, 10, 'srva', '2014-04-10 11:20:30', '8.749'),
(107743, 12, 'srvb', '2014-04-10 11:20:23', ''),
(107740, 31, 'srvb', '2014-04-10 11:20:23', '31.053'),
(107739, 19, 'srvb', '2014-04-10 11:20:23', '35.096'),
(107738, 10, 'srvb', '2014-04-10 11:20:23', '36.680'),
(107713, 12, 'srva', '2014-04-10 11:15:31', ''),
(107710, 31, 'srva', '2014-04-10 11:15:31', '2.489'),
(107709, 19, 'srva', '2014-04-10 11:15:31', '6.519'),
(107708, 10, 'srva', '2014-04-10 11:15:31', '15.279'),
(107683, 12, 'srvb', '2014-04-10 11:15:23', ''),
(107680, 31, 'srvb', '2014-04-10 11:15:23', '31.236'),
(107679, 19, 'srvb', '2014-04-10 11:15:23', '34.834'),
(107678, 10, 'srvb', '2014-04-10 11:15:23', '37.294'),
(107653, 12, 'srva', '2014-04-10 11:10:31', ''),
(107650, 31, 'srva', '2014-04-10 11:10:31', '2.561'),
(107649, 19, 'srva', '2014-04-10 11:10:31', '5.446'),
(107648, 10, 'srva', '2014-04-10 11:10:31', '8.763'),
(107623, 12, 'srvb', '2014-04-10 11:10:22', ''),
(107620, 31, 'srvb', '2014-04-10 11:10:22', '30.716'),
(107619, 19, 'srvb', '2014-04-10 11:10:22', '34.679'),
(107618, 10, 'srvb', '2014-04-10 11:10:22', '36.854'),
(107593, 12, 'srva', '2014-04-10 11:05:32', ''),
(107590, 31, 'srva', '2014-04-10 11:05:32', '2.355'),
(107589, 19, 'srva', '2014-04-10 11:05:32', '5.720'),
(107588, 10, 'srva', '2014-04-10 11:05:32', '10.779'),
(107563, 12, 'srvb', '2014-04-10 11:05:22', ''),
(107560, 31, 'srvb', '2014-04-10 11:05:22', '31.217'),
(107559, 19, 'srvb', '2014-04-10 11:05:22', '35.360'),
(107558, 10, 'srvb', '2014-04-10 11:05:22', '37.079'),
(107533, 12, 'srva', '2014-04-10 11:00:32', ''),
(107530, 31, 'srva', '2014-04-10 11:00:32', '2.526'),
(107529, 19, 'srva', '2014-04-10 11:00:32', '5.949'),
(107528, 10, 'srva', '2014-04-10 11:00:32', '8.691');

I want to list the MAX (avg) corresponding to worker_id.

SELECT * FROM  `TK_servers`
JOIN (SELECT max(`avg`), (`id`) id FROM `TK_servers`
 WHERE `server_id` = '31'
 GROUP BY LEFT(date_ins,16) )
t2 ON t2.id = `TK_servers`.`id`

Result :

ID     SERVER_ID  WORKER_ID   DATE_INS                        AVG     MAX(`AVG`)
108250    31      srva        April, 10 2014 12:00:31+0000    2.337   31.183 
108190    31      srva        April, 10 2014 11:55:31+0000    2.500   30.766 
108130    31      srva        April, 10 2014 11:50:31+0000    2.538   30.948 
108070    31      srva        April, 10 2014 11:45:32+0000    2.502   30.827 
......

error the max(avg) is worker_id srvb

Compare and contrast...

SELECT * FROM tk_servers ORDER BY avg DESC LIMIT 1;
+--------+-----------+-----------+---------------------+-------+
| id     | server_id | worker_id | date_ins            | avg   |
+--------+-----------+-----------+---------------------+-------+
| 108068 | 10        | srva      | 2014-04-10 11:45:32 | 9.202 |
+--------+-----------+-----------+---------------------+-------+

SELECT * FROM tk_servers ORDER BY avg+0 DESC LIMIT 1;
+--------+-----------+-----------+---------------------+--------+
| id     | server_id | worker_id | date_ins            | avg    |
+--------+-----------+-----------+---------------------+--------+
| 108041 | 19        | srvb      | 2014-04-10 11:45:22 | 46.626 |
+--------+-----------+-----------+---------------------+--------+

So, hopefully this underlines the importance of using the correct data types. In this case, it should be DECIMAL(6,3) NULL, not VARCHAR!

the problem is your avgerage column is in varchar you should must change.

and then use the code like:

select id, server_id, worker_id, date_ins ,max(avg) from tk_servers

http://sqlfiddle.com/#!2/4d3529/32

UPDATE:1

SELECT * 
FROM  `TK_servers`
JOIN 
(
SELECT 
  max(`avg`), 
      (`id`) id 
  FROM `TK_servers`
  WHERE `server_id` = '31'
  GROUP BY LEFT(date_ins,16) 
)t2 
ON t2.id = `TK_servers`.`id`
LIMIT 1;

http://sqlfiddle.com/#!2/4d3529/35

Change the data type of AVG field from varchar to double and then try to fetch the MAX(AVG) it will work.

Hope the avg is making the problem

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM