MYSQL MAX / COUNT / IN / DATE - PullRequest
       12

MYSQL MAX / COUNT / IN / DATE

2 голосов
/ 14 мая 2009

Надеюсь, вы можете посоветовать. Я дергаю волосы за вопрос и надеюсь, что вы можете посоветовать.

У меня есть таблица, в которой я хочу выбрать MAX из внутреннего числа между датами с IN.

Просмотр таблицы

Вот что я попробовал, но безуспешно.

SELECT MAX(no_hits) from (SELECT count(hits) AS 'no_hits' ) FROM stats WHERE 'date' >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH AND zones_code IN('011242077793513596890', '011242077783866125432'))

Так что, в основном, я хочу, чтобы только один no_hits был возвращен для наиболее эффективной зоны.

Надеюсь, что вы можете посоветовать, где я не так.

И спасибо, если вы снимаете

Ответы [ 3 ]

2 голосов
/ 14 мая 2009

Ваш запрос:

SELECT MAX(no_hits) 
FROM (SELECT count(hits) AS 'no_hits' ) FROM stats 
  WHERE 'date' >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH 
    AND zones_code IN('011242077793513596890', '011242077783866125432')
);

Вот некоторые проблемы с вашим запросом:

  • Вы закрыли скобки подзапроса после 'no_hits'.
  • Вы не указали псевдоним таблицы для подзапроса. Каждая производная таблица должна иметь псевдоним таблицы.
  • Вы не закрыли скобки для функции DATE_SUB().
  • Вы использовали COUNT(), где, я думаю, вам следует использовать SUM(), если вы хотите общее количество попаданий на зону.
  • Вы не связываете промежуточный итог попаданий с каждой зоной; ваш промежуточный итог для всей таблицы.
  • Вы использовали строковые разделители ('') для 'date' вместо идентификаторов (т.е. обратных кавычек). Вы сравниваете буквенную строку 'date' со значением даты, когда вы хотите сравнить столбец date со значением даты.

Запрос в ответе @ chaos близок, но я думаю, что вы должны использовать SUM():

SELECT `zones_code`, SUM(`hits`) AS `no_hits`
FROM `stats`
WHERE `date` >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
GROUP BY `zones_code`
ORDER BY `no_hits` DESC
LIMIT 1;

Результат: zone_code 011242077793513596890, всего 255 обращений.


PS: Когда вы задаете вопросы онлайн, пожалуйста, предоставьте в текстовом формате достаточно кода и данных, чтобы люди могли легко тестировать. Вы предоставили снимок экрана с некоторыми примерами данных без указания кода создания таблицы. Это не так полезно, как если бы вы указали действительный оператор CREATE TABLE и пример оператора INSERT для его заполнения.

CREATE TABLE IF NOT EXISTS `stats` (
  `id` int(11) NOT NULL,
  `zones_code` char(21) default NULL,
  `date` date default NULL,
  `hits` int(11) default NULL,
  PRIMARY KEY  (`id`)
);

INSERT INTO stats VALUES
(10, '011242077793513596890', '2009-05-11', 13),
(12, '011242077793513596890', '2009-05-12',235),
(24, '011242077793513596890', '2009-05-13',  2),
(32, '011242077793513596890', '2009-05-14',  5),
(17, '011242077783866125432', '2009-05-12',165),
(22, '011242077783866125432', '2009-05-13',  2),
(30, '011242077783866125432', '2009-05-14',  5),
(19, '011242077743853330663', '2009-05-12', 61),
(20, '011242077737314753388', '2009-05-12', 54),
(28, '011242077737314753388', '2009-05-13',  7),
(36, '011242077737314753388', '2009-05-14', 31),
(14, '011242077730456603312', '2009-05-12',240),
(26, '011242077730456603312', '2009-05-13',  2),
(34, '011242077730456603312', '2009-05-14',  5);

Это то, что мне нужно было набрать на основе вашего снимка экрана!

Сделайте себе одолжение и сделайте так, чтобы людям было проще помочь вам.

2 голосов
/ 14 мая 2009
SELECT `zones_code`, SUM(`hits`) AS `no_hits`
FROM `stats`
WHERE `date` >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)
GROUP BY `zones_code`
ORDER BY `no_hits` DESC
LIMIT 1
0 голосов
/ 14 мая 2009

Я бы использовал предложение порядка ORDER BY DESC с LIMIT 1, чтобы получить только максимальное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...