Здравствуйте, rav, Вы писали:
rav>БД mysql 4.0 rav>имеются таблицы посещений конкретных страниц (pageid) по месяцам rav>month1 (id,pageid,visits,date) — таблица по датам за 1 месяц rav>month2 (id,pageid,visits,date) — таблица по датам за 2 месяц rav>
rav>CREATE TABLE `month1` (
rav> `id` INT(12) UNSIGNED NOT NULL AUTO_INCREMENT,
rav> `pageid` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0',
rav> `visits` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0',
rav> `datevisit` DATE NOT NULL DEFAULT '0000-00-00',
rav> PRIMARY KEY (`id`),
rav> INDEX `pageid` (`pageid`),
rav> INDEX `datevisit` (`datevisit`)
rav>)
rav>CREATE TABLE `month2` (
rav> `id` INT(12) UNSIGNED NOT NULL AUTO_INCREMENT,
rav> `pageid` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0',
rav> `visits` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0',
rav> `datevisit` DATE NOT NULL DEFAULT '0000-00-00',
rav> PRIMARY KEY (`id`),
rav> INDEX `pageid` (`pageid`),
rav> INDEX `datevisit` (`datevisit`)
rav>)
rav>
rav>требуется создать rav>year1 (id,pageid,month1,month2) — суммарная статистика по месяцам rav>в итоговую таблицу year1 собрать сумму визитов по месяцам и записать в поля month1, month2 rav>
rav>INSERT INTO year1 (pageid,month1)
rav>SELECT pageid, SUM(visits) as visits FROM month1 GROUP BY pageid;
rav>UPDATE year1 as t1
rav>SET t1.month2 = t2.visitsum
rav>FROM (SELECT SUM(visits) as visitsum FROM month2 GROUP BY pageid) AS t2
rav>WHERE (t2.pageid = t1.pageid)
rav>
rav>insert проходит, но на update получаю ошибку rav>/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM (SELECT SUM(visits) as visitsum FROM month2 GROUP' at line 3 */
rav>подскажите, что не так ? или есть более оптимальный способ решения?
А если перекрутить итоговую таблицу вот так
CREATE TABLE YearSumm
(
ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
Month INT NOT NULL,
PageID INT NOT NULL,
CountVisits INT NOT NULL
)
А потом
INSERT YearSumm(Month,PageID,CountVisits)
SELECT 1,PageID,SUM(Visits) FROM Month1 GROUP BY PageID
UNION ALL
SELECT 2,PageID,SUM(Visits) FROM Month1 GROUP BY PageID
БД mysql 4.0
имеются таблицы посещений конкретных страниц (pageid) по месяцам
month1 (id,pageid,visits,date) — таблица по датам за 1 месяц
month2 (id,pageid,visits,date) — таблица по датам за 2 месяц
CREATE TABLE `month1` (
`id` INT(12) UNSIGNED NOT NULL AUTO_INCREMENT,
`pageid` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0',
`visits` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0',
`datevisit` DATE NOT NULL DEFAULT '0000-00-00',
PRIMARY KEY (`id`),
INDEX `pageid` (`pageid`),
INDEX `datevisit` (`datevisit`)
)
CREATE TABLE `month2` (
`id` INT(12) UNSIGNED NOT NULL AUTO_INCREMENT,
`pageid` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0',
`visits` SMALLINT(6) UNSIGNED NOT NULL DEFAULT '0',
`datevisit` DATE NOT NULL DEFAULT '0000-00-00',
PRIMARY KEY (`id`),
INDEX `pageid` (`pageid`),
INDEX `datevisit` (`datevisit`)
)
требуется создать
year1 (id,pageid,month1,month2) — суммарная статистика по месяцам
в итоговую таблицу year1 собрать сумму визитов по месяцам и записать в поля month1, month2
CREATE TABLE `year1` (
`id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
`pageid` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID SRT',
`m1` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'январь',
`m2` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'февраль',
PRIMARY KEY (`id`),
INDEX `pageid` (`pageid`)
)
пробую такой запрос
INSERT INTO year1 (pageid,month1)
SELECT pageid, SUM(visits) as visits FROM month1 GROUP BY pageid;
UPDATE year1 as t1
SET t1.month2 = t2.visitsum
FROM (SELECT SUM(visits) as visitsum FROM month2 GROUP BY pageid) AS t2
WHERE (t2.pageid = t1.pageid)
insert проходит, но на update получаю ошибку
/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM (SELECT SUM(visits) as visitsum FROM month2 GROUP' at line 3 */
подскажите, что не так ? или есть более оптимальный способ решения?
Здравствуйте, rav, Вы писали: rav>пробую такой запрос rav>
rav>INSERT INTO year1 (pageid,month1)
rav>SELECT pageid, SUM(visits) as visits FROM month1 GROUP BY pageid;
rav>UPDATE year1 as t1
rav>SET t1.month2 = t2.visitsum
rav>FROM (SELECT SUM(visits) as visitsum FROM month2 GROUP BY pageid) AS t2
rav>WHERE (t2.pageid = t1.pageid)
rav>
rav>insert проходит, но на update получаю ошибку rav>/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM (SELECT SUM(visits) as visitsum FROM month2 GROUP' at line 3 */
rav>подскажите, что не так ? или есть более оптимальный способ решения?
Если бы это был TSQL, то надо было бы писать update без алиаса на обновляемую таблицу:
UPDATE year1
SET month2 = t2.visitsum
FROM (SELECT SUM(visits) as visitsum FROM month2 GROUP BY pageid) AS t2
WHERE (t2.pageid =year1.pageid)
Шурыгин Сергей
"Не следует преумножать сущности сверх необходимости" (с) Оккам
Здравствуйте, rav, Вы писали:
rav>БД mysql 4.0 rav>пробую такой запрос rav>
rav>UPDATE year1 as t1
rav>SET t1.month2 = t2.visitsum
rav>FROM (SELECT SUM(visits) as visitsum FROM month2 GROUP BY pageid) AS t2
rav>WHERE (t2.pageid = t1.pageid)
rav>
rav>на update получаю ошибку rav>/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM (SELECT SUM(visits) as visitsum FROM month2 GROUP' at line 3 */ rav>подскажите, что не так ? или есть более оптимальный способ решения?
В операторе UPDATE нет секции FROM. Ошибка в этом.
Как минимум можно переписать так:
UPDATE year1 as t1
SET t1.m2 = (SELECT SUM(visits) as visitsum FROM month2 WHERE month2.pageid=t1.pageid)
Несколько замечаний: структура таблиц посещений вызывает вопросы, структура таблицы статистики тоже не радует.
Никогда не бойся браться делать то, что делать не умеешь. Помни, ковчег был построен любителем. Профессионалы построили Титаник...