Сложный двухтабличный UPDATE на MySQL

12
Слава Шевцов
На сайте с 23.07.2005
Offline
370
2401

Для умеющих решать сложные MySQL-задачки. Есть таблица с исходными данными

CREATE TABLE stats

(
/* user_timestamp и user_rand полностью идентифицируют
* уникального посетителя
*/
user_timestamp int unsigned not null default '0',
user_rand smallint unsigned not null default '0',

/* У раздела с landing_login_id может быть
* несколько страниц landing_page_id
*/
landing_login_id int unsigned not null default '0',
landing_page_id tinyint unsigned not null default '0'
);

Есть целевая таблица

CREATE TABLE stats_aggregate

(
landing_login_id int unsigned not null default '0',

/* Хранится количество уникальных пользователей,
* зашедших на страницы раздела с landing_login_id
*/
unique_users int unsigned not null default '0'
);

Нужно посчитать число уников по паре user_timestamp и user_rand, зашедших в раздел landing_login_id, и это число засунуть в unique_users таблицы stats_aggregate. И так для каждого landing_login_id, причём одним запросом для всех. Напишите запрос :rolleyes:

Неизменность точки зрения неизменно порождает иллюзию понимания.
[Удален]
#1

Слава может проще на php скриптик написать, быстрей будет чем ждать ))

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#2

KosoyRoman, большие объёмы + каждый час :(

-
На сайте с 07.12.2005
Offline
97
-K-
#3

* не, не так :)

-K- добавил 29.05.2009 в 15:57

Для начала попрубуйте что этот запрос возвращает:


SELECT
landing_login_id,
(
SELECT
COUNT(s2.landing_login_id)
FROM
stats AS s2
WHERE
s.landing_login_id = s2.landing_login_id AND
user_timestamp IN (
SELECT DISTINCT
user_timestamp
FROM
stats AS s3
WHERE
s3.landing_login_id = s.landing_login_id
) AND
user_rand IN (
SELECT DISTINCT
user_rand
FROM
stats AS s4
WHERE
s4.landing_login_id = s.landing_login_id
)
)
FROM stats AS s GROUP BY s.landing_login_id

Верные данные?

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#4

Ошибку возвращает: "#1146 - Table 'dbnane.s' doesn't exist"

-
На сайте с 07.12.2005
Offline
97
-K-
#5

А версия какая?

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#6

Денвер:

Добро пожаловать в phpMyAdmin 2.6.1

MySQL 5.0.45-community-nt на localhost как root@localhost

СКОРПИОН
На сайте с 05.01.2006
Offline
120
#7

Слава Шевцов, я бы триггер на первую таблицу повесил - нагрузка на СУБД минимальная, ожидаемый результат будет получаться в реальном режиме времени... В противном случае, при больших объёмах данных, такие скрипты обычно запускают на второй машине, куда реплицируется база данных.

• Контекстные ссылки с внутренних страниц навсегда (/ru/forum/370882) • Качественные сайты для заработка на контекстной рекламе и ссылках
-
На сайте с 07.12.2005
Offline
97
-K-
#8

Странно, у меня практически тоже самое Server version: 5.0.51a-24+lenny1

Может какие сокращения мои считает зарезервированными, попробуйте так:


SELECT
sTable.landing_login_id,
(
SELECT
COUNT(sTable2.landing_login_id)
FROM
stats AS sTable2
WHERE
sTable.landing_login_id = sTable2.landing_login_id AND
user_timestamp IN (
SELECT DISTINCT
user_timestamp
FROM
stats AS sTable3
WHERE
sTable3.landing_login_id = sTable.landing_login_id
) AND
user_rand IN (
SELECT DISTINCT
user_rand
FROM
stats AS sTable4
WHERE
sTable4.landing_login_id = sTable.landing_login_id
)
) AS count
FROM stats AS sTable GROUP BY sTable.landing_login_id

Если будет ошибка, то её целиком, если можно.

-K- добавил 29.05.2009 в 16:20

СКОРПИОН:
Слава Шевцов, я бы триггер на первую таблицу повесил - нагрузка на СУБД минимальная, ожидаемый результат будет получаться в реальном режиме времени... В противном случае, при больших объёмах данных, такие скрипты обычно запускают на второй машине, куда реплицируется база данных.

Ну для начала свести уникальность пользователя к одному полю - это бы уже упростило заметно запрос :)

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#9

Теперь нормально. Ответ запрос даёт правильный.

СКОРПИОН
На сайте с 05.01.2006
Offline
120
#10
-K-:
Ну для начала свести уникальность пользователя к одному полю - это бы уже упростило заметно запрос :)

Обязательно! Первичный ключ в такой таблице должен быть однозначно составным.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий