2013-02-14 2 views
2

схемы:SQL SUM не работает - так что кажется

-- phpMyAdmin SQL Dump 
-- version 3.4.5 
-- http://www.phpmyadmin.net 
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 
SET time_zone = "+00:00"; 
CREATE TABLE IF NOT EXISTS `links` (
    `pageId` int(10) unsigned NOT NULL, 
    `linkId` int(10) unsigned NOT NULL, 
    `whenUsed` datetime NOT NULL, 
    `whenRendered` datetime NOT NULL, 
    KEY `pageId` (`pageId`), 
    KEY `linkId` (`linkId`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
INSERT INTO `links` (`pageId`, `linkId`, `whenUsed`, `whenRendered`) VALUES 
(1, 9, '2013-02-14 00:44:20', '2013-02-14 00:42:39'), 
(1, 9, '2013-02-14 00:44:21', '2013-02-14 00:42:39'), 
(1, 9, '2013-02-14 00:44:23', '2013-02-14 00:44:21'), 
(1, 8, '2013-02-14 00:44:25', '2013-02-14 00:44:23'), 
(1, 7, '2013-02-14 00:44:26', '2013-02-14 00:44:25'), 
(1, 6, '2013-02-14 00:44:28', '2013-02-14 00:44:26'), 
(1, 3, '2013-02-14 00:44:29', '2013-02-14 00:44:26'), 
(1, 7, '2013-02-14 00:44:31', '2013-02-14 00:44:29'), 
(1, 8, '2013-02-14 00:44:32', '2013-02-14 00:44:31'), 
(1, 11, '2013-02-14 00:44:34', '2013-02-14 00:44:32'); 

Внутренний запрос:

SELECT `linkId`, 
TIMEDIFF(`whenUsed`, `whenRendered`) AS 'URDiff', 
CONVERT(DATEDIFF(`whenUsed`, UTC_TIMESTAMP()), SIGNED) AS 'dateDiff', 
CONVERT('dateDiff' = 0, UNSIGNED) AS 'usedToday', 
CONVERT('dateDiff' < 8 AND 'dateDiff' > 0, UNSIGNED) AS 'usedThisWeek', 
CONVERT('dateDiff' < 31 AND 'dateDiff' > 7, UNSIGNED) AS 'usedThisMonth', 
CONVERT('dateDiff' < 365 AND 'dateDiff' > 30, UNSIGNED) AS 'usedThisYear' 
FROM `links` 
WHERE MINUTE('URDiff') < 15 AND HOUR('URDiff') = 0 
AND `pageId` = '1' 
) AS T 

Результаты внутреннего запроса:

+--------+----------+----------+-----------+--------------+---------------+--------------+ 
| linkId | URDiff | dateDiff | usedToday | usedThisWeek | usedThisMonth | usedThisYear | 
+--------+----------+----------+-----------+--------------+---------------+--------------+ 
|  9 | 00:01:41 |  0 |   1 |   0 |    0 |   0 | 
|  9 | 00:01:42 |  0 |   1 |   0 |    0 |   0 | 
|  9 | 00:00:02 |  0 |   1 |   0 |    0 |   0 | 
|  8 | 00:00:02 |  0 |   1 |   0 |    0 |   0 | 
|  7 | 00:00:01 |  0 |   1 |   0 |    0 |   0 | 
|  6 | 00:00:02 |  0 |   1 |   0 |    0 |   0 | 
|  3 | 00:00:03 |  0 |   1 |   0 |    0 |   0 | 
|  7 | 00:00:02 |  0 |   1 |   0 |    0 |   0 | 
|  8 | 00:00:01 |  0 |   1 |   0 |    0 |   0 | 
|  11 | 00:00:02 |  0 |   1 |   0 |    0 |   0 | 
+--------+----------+----------+-----------+--------------+---------------+--------------+ 

Outer Запрос:

SELECT 
`linkId`, 
SUM('T.usedToday') AS 'countToday', 
SUM('T.usedThisWeek') AS 'countThisWeek', 
SUM('T.usedThisMonth') AS 'countThisMonth', 
SUM('T.usedThisYear') AS 'countThisYear' 
FROM 
(
SELECT `linkId`, 
TIMEDIFF(`whenUsed`, `whenRendered`) AS 'URDiff', 
CONVERT(DATEDIFF(`whenUsed`, UTC_TIMESTAMP()), SIGNED) AS 'dateDiff', 
CONVERT('dateDiff' = 0, UNSIGNED) AS 'usedToday', 
CONVERT('dateDiff' < 8 AND 'dateDiff' > 0, UNSIGNED) AS 'usedThisWeek', 
CONVERT('dateDiff' < 31 AND 'dateDiff' > 7, UNSIGNED) AS 'usedThisMonth', 
CONVERT('dateDiff' < 365 AND 'dateDiff' > 30, UNSIGNED) AS 'usedThisYear' 
FROM `links` 
WHERE MINUTE('URDiff') < 15 AND HOUR('URDiff') = 0 
AND `pageId` = '1' 
) AS T 
GROUP BY `linkId` 

Внешний результат запроса:

+--------+------------+---------------+----------------+---------------+ 
| linkId | countToday | countThisWeek | countThisMonth | countThisYear | 
+--------+------------+---------------+----------------+---------------+ 
|  3 |   0 |    0 |    0 |    0 | 
|  6 |   0 |    0 |    0 |    0 | 
|  7 |   0 |    0 |    0 |    0 | 
|  8 |   0 |    0 |    0 |    0 | 
|  9 |   0 |    0 |    0 |    0 | 
|  11 |   0 |    0 |    0 |    0 | 
+--------+------------+---------------+----------------+---------------+ 

Go цифра? Я могу ясно видеть из внутренних результатов, что в столбце usedToday есть 3 строки, которые равны 1 (и я преобразовал их в unsigned, чтобы они были SUM в порядке) для linkId 9. Однако countDoday для linkId 9 равен 0, а не 3. Зачем?

MySQL дает мне некоторые интересные предупреждения:

Warning (Code 1292): Truncated incorrect time value: 'URDiff' 
Warning (Code 1292): Truncated incorrect time value: 'URDiff' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'dateDiff' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'dateDiff' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'dateDiff' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'dateDiff' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'dateDiff' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'dateDiff' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'dateDiff' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedToday' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisWeek' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisMonth' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisYear' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedToday' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisWeek' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisMonth' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisYear' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedToday' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisWeek' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisMonth' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisYear' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedToday' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisWeek' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisMonth' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisYear' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedToday' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisWeek' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisMonth' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisYear' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedToday' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisWeek' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisMonth' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisYear' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedToday' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisWeek' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisMonth' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisYear' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedToday' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisWeek' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisMonth' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisYear' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedToday' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisWeek' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisMonth' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisYear' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedToday' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisWeek' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisMonth' 
Warning (Code 1292): Truncated incorrect DOUBLE value: 'T.usedThisYear' 

Из того, что я смог найти в Интернете об этом предупреждении, это, кажется, произошло для некоторых людей, которые не использовали кавычки на их имена (которые я использовать везде). Теперь почему парсер дает такое предупреждение для использования цитаты?

+0

Try без SUM кавычки '(T.usedToday) AS«countToday»,' –

+0

Мой сын просто указал, что, используя кавычки в именах столбцов и ссылки на псевдонимы, кроме ПОРЯДКА BY, HAVING или GROUP BY была моей проблемой. –

+0

Исправленный запрос: ... слишком долго, чтобы опубликовать комментарий, и я не могу ответить на этот вопрос еще 7 часов! –

ответ

2

Папа! Вот запрос, который работал:

SELECT 
`linkId`, 
SUM(T.usedToday)ascountToday, 
SUM(T.usedThisWeek)as countThisWeek, 
SUM(T.usedThisMonth)as countThisMonth, 
SUM(T.usedThisYear)as countThisYear 
FROM 

(
    SELECT `linkId`, 
    TIMEDIFF(`whenUsed`, `whenRendered`) as URDiff, 
    DATEDIFF(`whenUsed`, UTC_TIMESTAMP()) as `dateDiff`, 
    if(DATEDIFF(`whenUsed`, UTC_TIMESTAMP()) = 0, 1, 0)as usedToday, 
    if(DATEDIFF(`whenUsed`, UTC_TIMESTAMP()) < 8 AND DATEDIFF(`whenUsed`, UTC_TIMESTAMP()) > 0, 1, 0)as usedThisWeek, 
    if(DATEDIFF(`whenUsed`, UTC_TIMESTAMP()) < 31 AND DATEDIFF(`whenUsed`, UTC_TIMESTAMP()) > 7, 1, 0) as usedThisMonth, 
    if(DATEDIFF(`whenUsed`, UTC_TIMESTAMP()) < 365 AND DATEDIFF(`whenUsed`, UTC_TIMESTAMP()) > 30, 1, 0) as usedThisYear 
    FROM `links` 
    WHERE MINUTE(TIMEDIFF(`whenUsed`, `whenRendered`)) < 15 AND HOUR(TIMEDIFF(`whenUsed`, `whenRendered`)) = 0 
    AND `pageId` = 1 
) as T 

GROUP BY `linkId` 
Смежные вопросы