Re: помогите с запросом массового update
От: londinium Украина  
Дата: 21.06.11 10:14
Оценка: -1
Здравствуйте, 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>CREATE TABLE `year1` (
rav>    `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
rav>    `pageid` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'ID SRT',
rav>    `m1` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'январь',
rav>    `m2` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'февраль',
rav>    PRIMARY KEY (`id`),
rav>    INDEX `pageid` (`pageid`)
rav>)
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>подскажите, что не так ? или есть более оптимальный способ решения?


А если перекрутить итоговую таблицу вот так


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
помогите с запросом массового update
От: rav  
Дата: 21.06.11 08:58
Оценка:
БД 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 */

подскажите, что не так ? или есть более оптимальный способ решения?
Re: помогите с запросом массового update
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 25.06.11 08:06
Оценка:
Здравствуйте, 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)

Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re: помогите с запросом массового update
От: VVP Россия 67524421
Дата: 25.06.11 09:49
Оценка:
Здравствуйте, 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)


Несколько замечаний: структура таблиц посещений вызывает вопросы, структура таблицы статистики тоже не радует.
Никогда не бойся браться делать то, что делать не умеешь. Помни, ковчег был построен любителем. Профессионалы построили Титаник...
Re[2]: помогите с запросом массового update
От: VVP Россия 67524421
Дата: 25.06.11 09:56
Оценка:
Здравствуйте, VVP, Вы писали:

VVP>Здравствуйте, rav, Вы писали:

VVP>Как минимум можно переписать так:
VVP>UPDATE year1 as t1
VVP>SET t1.m2 = (SELECT SUM(visits) as visitsum FROM month2 WHERE month2.pageid=t1.pageid)

Кстати, возможна оптимизация (судя по руководству):
UPDATE year1, month2
SET year1.m2 = SUM(month2.visits)
WHERE month2.pageid=month.pageid
Оптимизацию не тестировал.
Никогда не бойся браться делать то, что делать не умеешь. Помни, ковчег был построен любителем. Профессионалы построили Титаник...
Re[3]: помогите с запросом массового update
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 25.06.11 10:02
Оценка:
Здравствуйте, VVP, Вы писали:


VVP>
VVP>UPDATE year1, month2
VVP>SET year1.m2 = SUM(month2.visits)
VVP>WHERE month2.pageid=month.pageid
VVP>
Оптимизацию не тестировал.


А MySql поддерживает агрегирующие функции в SET? MSSQL точно не поддерживает.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[4]: помогите с запросом массового update
От: VVP Россия 67524421
Дата: 25.06.11 10:15
Оценка:
Здравствуйте, Sshur, Вы писали:

VVP>>
UPDATE year1, month2
VVP>>SET year1.m2 = SUM(month2.visits)
VVP>>WHERE month2.pageid=month.pageid
VVP>>
Оптимизацию не тестировал.

S>А MySql поддерживает агрегирующие функции в SET? MSSQL точно не поддерживает.
Да без проблем:
UPDATE year1, (select pageid, sum(visits) as visits from month2 group by pageid) as m2
SET year1.m2 = m2.visits
WHERE m2.pageid=year.pageid
Это будет работать на любом вменяемом скуле.
Никогда не бойся браться делать то, что делать не умеешь. Помни, ковчег был построен любителем. Профессионалы построили Титаник...
Re[5]: помогите с запросом массового update
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 25.06.11 10:25
Оценка:
Здравствуйте, VVP, Вы писали:
S>>А MySql поддерживает агрегирующие функции в SET? MSSQL точно не поддерживает.
VVP>Да без проблем:
VVP>
UPDATE year1, (select pageid, sum(visits) as visits from month2 group by pageid) as m2
VVP>SET year1.m2 = m2.visits
VVP>WHERE m2.pageid=year.pageid
Это будет работать на любом вменяемом скуле.


То есть MySql не умеет Update..from?
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.