@Ms12341234

Как составить SQL запрос для базы данных?

Задание - /* Есть 3 таблицы.
Необходимо написать запрос, который выберет список сайтов (site), у которых есть более трёх активных (status=1) блоков (site_area).

Выборка должна содержать четыре поля: id сайта, url сайта, общее число показов и общий доход на этом сайте (со всех его блоков).

Данные таблиц - # список сайтов
CREATE TABLE IF NOT EXISTS `site` (
`site_id` INT(12) UNSIGNED NOT NULL,
`url` VARCHAR(255) NOT NULL,
`user_id` INT(12) UNSIGNED NOT NULL,
`status` INT(12) UNSIGNED NOT NULL,
PRIMARY KEY (`site_id`)
)
DEFAULT CHARSET = utf8;
INSERT INTO `site` (`site_id`, `url`, `user_id`, `status`) VALUES
('1025', 'site1.com', '275', 1),
('1026', 'test_site.net', '278', 0),
('1027', 'site17.net', '275', 1),
('1028', 'test_test_site.fr', '270', 1);

# список блоков
CREATE TABLE IF NOT EXISTS `site_area` (
`site_area_id` INT(12) UNSIGNED NOT NULL,
`name` VARCHAR(255) NOT NULL,
`site_id` INT(12) UNSIGNED NOT NULL,
`status` INT(12) UNSIGNED NOT NULL,
`size` VARCHAR(255) NOT NULL,
PRIMARY KEY (`site_area_id`)
)
DEFAULT CHARSET = utf8;
INSERT INTO `site_area` (`site_area_id`, `site_id`, `name`, `status`, `size`) VALUES
('628', '527', 'sidebar_1', 1, '160x600'),
('629', '1025', 'in_article', 1, '300x250'),
('673', '1025', 'sidebar_4', 1, '300x600'),
('674', '1025', 'sidebar_5', 1, '300x600'),
('676', '1025', 'sidebar_6', 1, '300x600'),
('677', '1025', 'sidebar_7', 0, '300x600'),
('670', '1026', 'sidebar_1', 1, '300x600'),
('671', '1026', 'sidebar_2', 0, '300x250'),
('675', '1026', 'sidebar_3', 0, '300x250');

# статистика
CREATE TABLE IF NOT EXISTS `npm_site_area_stat_cache` (
`date` DATE NOT NULL,
`site_area_id` INT(12) UNSIGNED NOT NULL,
`impression_count` INT(12) UNSIGNED NOT NULL,
`revenue` DECIMAL(21, 8),
PRIMARY KEY (`date`, `site_area_id`)
)
DEFAULT CHARSET = utf8;
INSERT INTO `npm_site_area_stat_cache` (`date`, `site_area_id`, `impression_count`, `revenue`) VALUES
('2019-10-20', 628, 57565, 25.10),
('2019-10-22', 628, 61277, 40.25),
('2019-10-22', 629, 1245, 0.95),
('2019-10-22', 673, 755, 0.05),
('2019-10-22', 651, 889115, 525.25);

Составил 1 запрос на поиск 3 полей -
SELECT
Site_id, url,
COUNT(user_id)
FROM site
GROUP BY site_id, url;

Потом сделал запрос на поиск общего дохода

SELECT
site_area_id, revenue,
COUNT(revenue)
FROM npm_site_area_stat_cache
GROUP BY site_area_id, revenue;

Не понимаю как сделать выборку по starus=1 and blok_area>3 ( чтобы во 2 таблице найти все поля под такие данные)
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 2
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Попробуйте так:
SELECT
    Site_id, url,
    COUNT(DISTINCT site_area.site_area_id) active_blocks,
    SUM(impression_count) impression_count,
    SUM(revenue) revenue
FROM site
JOIN site_area USING(site_id)
LEFT JOIN npm_site_area_stat_cache USING(site_area_id)
WHERE site_area.status = 1
GROUP BY site_id, url
HAVING COUNT(DISTINCT site_area.site_area_id) > 3;


MySQL query test
Ответ написан
@Ms12341234 Автор вопроса
SELECT
site_area_id, site_id,
COUNT(site_id)
FROM site_area
WHERE status=1
GROUP BY site_area_id, site_id;

Для 2 таблицы сделал, но не понимаю как сделать , чтобы отсортировать по "более 3 активных блоков"
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы