Практикум №1 - Связи между таблицами
Связи один-к-одному
1. Задача - Персональные данные
Регистрационные данные пользователей хранятся в таблице users, а персональные данные в users_p. Таблицы связаны друг с другом отношением один-к-одному так, что первичные ключи совпадают.
Получите идентификатор, имя и фамилию для пользователей зарегистрировавшихся (date_joined) после полуночи 1 января 2016 года с паспортами серия которых начинается на 32.
Отсортируйте данные по фамилии пользователей.
SET foreign_key_checks = 0;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS users_p;
SET foreign_key_checks = 1;
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NULL,
last_name VARCHAR(50) NULL,
age INTEGER NULL,
date_joined DATETIME NULL
);
INSERT INTO users (id, first_name, last_name, age, date_joined)
VALUES
(1, 'Дмитрий', 'Федьков', 18, '2015-04-08 12:34:41'),
(2, 'Светлана', 'Иванова', 30, '2015-04-08 12:31:16'),
(3, 'Никита', 'Трутнев', 17, '2016-01-12 08:00:03'),
(4, 'Денис', 'Кац', 22, '2016-03-30 23:57:11'),
(5, 'Алена', 'Сорокина', 16, '2016-04-01 00:10:23'),
(6, 'Василий', 'Федьков', 44, '2016-12-23 18:36:45'),
(7, 'Ярослав', 'Сорокин', 17, '2017-04-08 12:31:18'),
(8, 'Денис', 'Белый', 23, '2017-04-08 12:36:17'),
(9, 'Анатолий', 'Дейчман', 21, '2017-04-08 11:22:34'),
(10, 'Юлия', 'Фёдорова', 29, '2017-04-07 12:34:42'),
(11, 'Андрей', 'Ройзман', 30, '2017-04-08 12:35:09'),
(12, 'София', 'Турыгина', 15, '2017-04-05 07:12:41'),
(13, 'Анастасия', 'Татаренкова', 21, '2017-03-12 08:00:23'),
(14, 'Валерий', 'Редько', 29, '2017-04-08 12:34:59');
CREATE TABLE users_p (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
series VARCHAR(50) NULL,
number VARCHAR(50) NULL
);
INSERT INTO users_p (id, series, number)
VALUES
(1, '3205', '847414'),
(2, '4582', '748294'),
(3, '3209', '184851'),
(4, '5514', '981455'),
(5, '3201', '184755'),
(6, '5614', '194710'),
(7, '9831', '184751'),
(8, '4561', '856194'),
(9, '3135', '817414'),
(10, '3276', '174651'),
(11, '4532', '249584'),
(12, '1401', '736144'),
(13, '4104', '194714'),
(14, '1409', '184619');
| id | first_name | last_name | age | date_joined |
|---|---|---|---|---|
| 1 | Дмитрий | Федьков | 18 | 2015-04-08 12:34:41 |
| 2 | Светлана | Иванова | 30 | 2015-04-08 12:31:16 |
| 3 | Никита | Трутнев | 17 | 2016-01-12 08:00:03 |
| 4 | Денис | Кац | 22 | 2016-03-30 23:57:11 |
| 5 | Алена | Сорокина | 16 | 2016-04-01 00:10:23 |
| 6 | Василий | Федьков | 44 | 2016-12-23 18:36:45 |
| 7 | Ярослав | Сорокин | 17 | 2017-04-08 12:31:18 |
| 8 | Денис | Белый | 23 | 2017-04-08 12:36:17 |
| 9 | Анатолий | Дейчман | 21 | 2017-04-08 11:22:34 |
| 10 | Юлия | Фёдорова | 29 | 2017-04-07 12:34:42 |
| 11 | Андрей | Ройзман | 30 | 2017-04-08 12:35:09 |
| 12 | София | Турыгина | 15 | 2017-04-05 07:12:41 |
| 13 | Анастасия | Татаренкова | 21 | 2017-03-12 08:00:23 |
| 14 | Валерий | Редько | 29 | 2017-04-08 12:34:59 |
| id | series | number |
|---|---|---|
| 1 | 3205 | 847414 |
| 2 | 4582 | 748294 |
| 3 | 3209 | 184851 |
| 4 | 5514 | 981455 |
| 5 | 3201 | 184755 |
| 6 | 5614 | 194710 |
| 7 | 9831 | 184751 |
| 8 | 4561 | 856194 |
| 9 | 3135 | 817414 |
| 10 | 3276 | 174651 |
| 11 | 4532 | 249584 |
| 12 | 1401 | 736144 |
| 13 | 4104 | 194714 |
| 14 | 1409 | 184619 |
Решение задачи
SELECT users.id, users.first_name, users.last_name
FROM users, users_p
WHERE
users.id = users_p.id
AND
users.date_joined > '2016-01-01 00:00:00'
AND
users_p.series LIKE '32%'
ORDER BY users.last_name
2. Задача - Обновление пользователя
В таблице users хранится базовая информация о пользователях, а в таблице users_details — подробная. Таблицы связаны отношением один-к-одному так, что первичные ключи в таблицах совпадают.
Обновите данные о пользователе c id равным 8: измените email на karina.n@domain.com, а фамилию на Некифорова.
Выполните все изменения в одном SQL запросе.
SET foreign_key_checks = 0;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS users_details;
SET foreign_key_checks = 1;
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(50) NULL
);
INSERT INTO users (id, email)
VALUES
(1, 'user1@domain.com'),
(2, 'user2@domain.com'),
(3, 'user3@domain.com'),
(4, 'user4@domain.com'),
(5, 'user5@domain.com'),
(6, 'user6@domain.com'),
(7, 'user7@domain.com'),
(8, 'user8@domain.com'),
(9, 'user9@domain.com'),
(10, 'user10@domain.com');
CREATE TABLE users_details (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NULL,
last_name VARCHAR(50) NULL,
age INTEGER NULL
);
INSERT INTO users_details (id, first_name, last_name, age)
VALUES
(1, 'Виктор', 'Алтушев', 20),
(2, 'Светлана', 'Иванова', 17),
(3, 'Елена', 'Абрамова', 18),
(4, 'Василиса', 'Кац', 15),
(5, 'Антон', 'Сорокин', 22),
(6, 'Алёна', 'Алясева', 28),
(7, 'Дмитрий', 'Калякин', 21),
(8, 'Карина', 'Белая', 30),
(9, 'Анастасия', 'Дейчман', 16),
(10, 'Юлия', 'Фёдорова', 25);
| id | |
|---|---|
| 1 | user1@domain.com |
| 2 | user2@domain.com |
| 3 | user3@domain.com |
| 4 | user4@domain.com |
| 5 | user5@domain.com |
| 6 | user6@domain.com |
| 7 | user7@domain.com |
| 8 | user8@domain.com |
| 9 | user9@domain.com |
| 10 | user10@domain.com |
| id | first_name | last_name | age |
|---|---|---|---|
| 1 | Виктор | Алтушев | 20 |
| 2 | Светлана | Иванова | 17 |
| 3 | Елена | Абрамова | 18 |
| 4 | Василиса | Кац | 15 |
| 5 | Антон | Сорокин | 22 |
| 6 | Алёна | Алясева | 28 |
| 7 | Дмитрий | Калякин | 21 |
| 8 | Карина | Белая | 30 |
| 9 | Анастасия | Дейчман | 16 |
| 10 | Юлия | Фёдорова | 25 |
Решение задачи
UPDATE users, users_details
SET
users.email = 'karina.n@domain.com',
users_details.last_name = 'Некифорова'
WHERE
users.id = users_details.id
AND
users.id = 8
Связи один-ко-многим
3. Задача - Завершенные заказы
Таблицы users и orders связанны отношением один-ко-многим.orders содержит внешний ключ user_id, который ссылается на id пользователя.
Получите из таблиц дату и стоимость каждого выполненного заказа, а также фамилию и имя пользователя, который этот заказ оформил.
Информацию отсортируйте по дате заказа, дату выведите в формате ДД.ММ.ГГГГ в поле date.
SET foreign_key_checks = 0;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS orders;
SET foreign_key_checks = 1;
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NULL,
last_name VARCHAR(50) NULL,
age INTEGER NULL
);
INSERT INTO users (id, first_name, last_name, age)
VALUES
(1, 'Вероника', 'Петрова', 20),
(2, 'Светлана', 'Иванова', 17),
(3, 'Елена', 'Абрамова', 18),
(4, 'Василиса', 'Кац', 15),
(5, 'Алёна', 'Сорокина', 22),
(6, 'Алёна', 'Федькова', 28),
(7, 'Лиана', 'Сорокин', 21),
(8, 'Карина', 'Белая', 30),
(9, 'Анастасия', 'Дейчман', 16),
(10, 'Юлия', 'Фёдорова', 25);
CREATE TABLE orders (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user_id INTEGER NULL,
date DATETIME NULL,
amount INTEGER NULL,
status VARCHAR(50) NULL
);
INSERT INTO orders (id, user_id, date, amount, status)
VALUES
(1, 3, '2014-01-23 17:04:04', 4500, 'completed'),
(2, 1, '2014-03-12 12:12:43', 700, 'completed'),
(3, 10, '2014-12-31 08:53:25', 1240, 'new'),
(4, 7, '2015-01-04 18:23:09', 500, 'completed'),
(5, 1, '2015-01-04 18:25:27', 8700, 'cancelled'),
(6, 4, '2015-01-12 09:23:14', 1350, 'completed'),
(7, 10, '2015-01-14 17:16:39', 600, 'new'),
(8, 1, '2015-02-01 13:32:17', 680, 'completed'),
(9, 3, '2014-02-16 14:44:05', 1400, 'completed'),
(10, 5, '2015-02-28 02:00:47', 4300, 'cancelled'),
(11, 10, '2015-03-12 08:30:23', 8000, 'completed'),
(12, 2, '2015-04-01 13:04:47', 980, 'completed'),
(13, 2, '2015-04-14 23:21:25', 1600, 'completed');
| id | first_name | last_name | age |
|---|---|---|---|
| 1 | Вероника | Петрова | 20 |
| 2 | Светлана | Иванова | 17 |
| 3 | Елена | Абрамова | 18 |
| 4 | Василиса | Кац | 15 |
| 5 | Алёна | Сорокина | 22 |
| 6 | Алёна | Федькова | 28 |
| 7 | Лиана | Сорокин | 21 |
| 8 | Карина | Белая | 30 |
| 9 | Анастасия | Дейчман | 16 |
| 10 | Юлия | Фёдорова | 25 |
| id | user_id | date | amount | status |
|---|---|---|---|---|
| 1 | 3 | 2014-01-23 17:04:04 | 4500 | completed |
| 2 | 1 | 2014-03-12 12:12:43 | 700 | completed |
| 3 | 10 | 2014-12-31 08:53:25 | 1240 | new |
| 4 | 7 | 2015-01-04 18:23:09 | 500 | completed |
| 5 | 1 | 2015-01-04 18:25:27 | 8700 | cancelled |
| 6 | 4 | 2015-01-12 09:23:14 | 1350 | completed |
| 7 | 10 | 2015-01-14 17:16:39 | 600 | new |
| 8 | 1 | 2015-02-01 13:32:17 | 680 | completed |
| 9 | 3 | 2014-02-16 14:44:05 | 1400 | completed |
| 10 | 5 | 2015-02-28 02:00:47 | 4300 | cancelled |
| 11 | 10 | 2015-03-12 08:30:23 | 8000 | completed |
| 12 | 2 | 2015-04-01 13:04:47 | 980 | completed |
| 13 | 2 | 2015-04-14 23:21:25 | 1600 | completed |
Решение задачи
SELECT
DATE_FORMAT(orders.date,'%d.%m.%Y') AS date,
orders.amount,
users.last_name,
users.first_name
FROM users, orders
WHERE
orders.user_id = users.id
AND
orders.status = 'completed'
ORDER BY orders.date ASC
4. Задача - Товары с категориями и брендами
В базе данных есть три таблицы: products, categories и brands.
Выведите id и название товара, его цену, название категории и название бренда для товаров, которые есть на складе.
Название товара выведите в поле name, категорию в category, бренда в brand.
Отсортируйте данные по цене, а затем по id товара.
SET foreign_key_checks = 0;
DROP TABLE IF EXISTS brands;
DROP TABLE IF EXISTS categories;
DROP TABLE IF EXISTS products;
CREATE TABLE brands (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NULL
);
INSERT INTO brands (id, name)
VALUES
(1, 'Mango'),
(2, 'Love Republic'),
(3, 'Zarina'),
(4, 'Imajeans'),
(5, 'OLBE'),
(6, 'OPIMU'),
(7, 'FinFlare'),
(8, 'Sasha Rozhdestvenskaya'),
(9, 'Katomi'),
(10, 'Oodji');
CREATE TABLE categories (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NULL
);
INSERT INTO categories (id, name)
VALUES
(1, 'Джинсы'),
(2, 'Куртки'),
(3, 'Платья'),
(4, 'Жилетки'),
(5, 'Юбки'),
(6, 'Комплекты'),
(7, 'Брюки'),
(8, 'Водолазки'),
(9, 'Косухи'),
(10, 'Джеггинсы'),
(11, 'Плащи'),
(12, 'Леггинсы');
CREATE TABLE products (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NULL,
brand_id INT NOT NULL,
category_id INT NOT NULL,
count INT NULL,
price INT NULL,
sizes SET('32','34','36','38','40','42','44','46','48','50','52','M','L','S','XL','XS','2XL','4XL') NULL
);
INSERT INTO products (id, name, brand_id, category_id, count, price, sizes)
VALUES
(1, 'Джинсы Mango Lonny 2', 1, 1, 3, 2990, '34,36,38,42'),
(2, 'Куртка Magno Nico 2', 1, 2, 2, 4999, 'S,M,L'),
(3, 'Платье Love Republic', 2, 3, 7, 3699, '40,46,48'),
(4, 'Джинсы Mango Kim2', 1, 1, 3, 2499, '34,36,38,40'),
(5, 'Жилет Zarina', 3, 4, 7, 2519, '42,46,50,52'),
(6, 'Юбка Mango Park', 1, 5, 2, 3999, '34,36,38,40'),
(7, 'Комплект Mango (джинсы Lonny 2 и косуха)', 1, 6, 4, 11900, '36,38,M,L,S'),
(8, 'Джинсы Imajeans', 4, 1, 6, 1842, '34,36,38,42'),
(9, 'Брюки OLBE', 5, 7, 5, 2898, '44,46,48'),
(10, 'Джинсы Mango Jane2', 1, 1, 4, 200, '32,34,40'),
(11, 'Водолазка OPIMU', 6, 8, 12, 1527, 'M,XL,L,S'),
(12, 'Косуха Mango', 1, 9, 4, 9990, 'M,L,S'),
(13, 'Джинсы Uptown2 (Mango)', 1, 1, 7, 3499, '34,36,38,40,42'),
(14, 'Жилет FinFlare', 7, 4, 3, 6999, 'M,L,XL,2XL'),
(15, 'Джинсы Mango Soho2', 1, 1, 0, 1999, '34,36,38'),
(16, 'Джеггинсы Sasha Rozhdestvenskaya', 8, 10, 5, 1691, '42,46,48,50'),
(17, 'Плащ Mango SHERLOCK', 1, 11, 1, 6499, 'XS,S,M,L'),
(18, 'Юбка Katomi', 9, 5, 8, 3199, '34,40,42'),
(19, 'Джинсы Mango Noa2', 1, 1, 2, 2499, '32,34,36,38,40,42,44'),
(20, 'Леггинсы Oodji', 10, 12, 0, 349, 'M,L,S');
SET foreign_key_checks = 1;
| id | name | brand_id | category_id | count | price | sizes |
|---|---|---|---|---|---|---|
| 1 | Джинсы Mango Lonny 2 | 1 | 1 | 3 | 2990 | 34,36,38,42 |
| 2 | Куртка Magno Nico 2 | 1 | 2 | 2 | 4999 | S,M,L |
| 3 | Платье Love Republic | 2 | 3 | 7 | 3699 | 40,46,48 |
| 4 | Джинсы Mango Kim2 | 1 | 1 | 3 | 2499 | 34,36,38,40 |
| 5 | Жилет Zarina | 3 | 4 | 7 | 2519 | 42,46,50,52 |
| 6 | Юбка Mango Park | 1 | 5 | 2 | 3999 | 34,36,38,40 |
| 7 | Комплект Mango (джинсы Lonny 2 и косуха) | 1 | 6 | 4 | 11900 | 36,38,M,L,S |
| 8 | Джинсы Imajeans | 4 | 1 | 6 | 1842 | 34,36,38,42 |
| 9 | Брюки OLBE | 5 | 7 | 5 | 2898 | 44,46,48 |
| 10 | Джинсы Mango Jane2 | 1 | 1 | 4 | 200 | 32,34,40 |
| 11 | Водолазка OPIMU | 6 | 8 | 12 | 1527 | M,XL,L,S |
| 12 | Косуха Mango | 1 | 9 | 4 | 9990 | M,L,S |
| 13 | Джинсы Uptown2 (Mango) | 1 | 1 | 7 | 3499 | 34,36,38,40,42 |
| 14 | Жилет FinFlare | 7 | 4 | 3 | 6999 | M,L,XL,2XL |
| 15 | Джинсы Mango Soho2 | 1 | 1 | 0 | 1999 | 34,36,38 |
| 16 | Джеггинсы Sasha Rozhdestvenskaya | 8 | 10 | 5 | 1691 | 42,46,48,50 |
| 17 | Плащ Mango SHERLOCK | 1 | 11 | 1 | 6499 | XS,S,M,L |
| 18 | Юбка Katomi | 9 | 5 | 8 | 3199 | 34,40,42 |
| 19 | Джинсы Mango Noa2 | 1 | 1 | 2 | 2499 | 32,34,36,38,40,42,44 |
| 20 | Леггинсы Oodji | 10 | 12 | 0 | 349 | M,L,S |
| id | name |
|---|---|
| 1 | Джинсы |
| 2 | Куртки |
| 3 | Платья |
| 4 | Жилетки |
| 5 | Юбки |
| 6 | Комплекты |
| 7 | Брюки |
| 8 | Водолазки |
| 9 | Косухи |
| 10 | Джеггинсы |
| 11 | Плащи |
| 12 | Леггинсы |
| id | name |
|---|---|
| 1 | Mango |
| 2 | Love Republic |
| 3 | Zarina |
| 4 | Imajeans |
| 5 | OLBE |
| 6 | OPIMU |
| 7 | FinFlare |
| 8 | Sasha Rozhdestvenskaya |
| 9 | Katomi |
| 10 | Oodji |
Решение задачи
SELECT
products.id,
products.name AS name,
categories.name AS category,
brands.name AS brand
FROM products
JOIN brands ON products.brand_id = brands.id
JOIN categories ON products.category_id = categories.id
WHERE
products.count > 0
ORDER BY products.price ASC, products.id ASC
Связи многие-ко-многим
5. Задача - Сотрудники компании
Таблицы users и roles связаны отношением многие ко многим через таблицу users_roles.
Получите список всех ролей и количество сотрудников в каждой роли.
Выведите два поля: role — название должности и members — количество сотрудников в этой должности.
Данные отсортируйте по названию должности.
SET foreign_key_checks = 0;
DROP TABLE IF EXISTS roles;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS users_roles;
SET foreign_key_checks = 1;
CREATE TABLE roles (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NULL
);
INSERT INTO roles (id, name)
VALUES
(1, 'Менеджер'),
(2, 'Дизайнер'),
(3, 'Программист'),
(4, 'Маркетолог'),
(5, 'Бухгалтер');
CREATE TABLE users (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
first_name VARCHAR(50) NULL,
last_name VARCHAR(50) NULL
);
INSERT INTO users (id, first_name, last_name)
VALUES
(1, 'Виктор', 'Алтушев'),
(2, 'Светлана', 'Иванова'),
(3, 'Елена', 'Абрамова'),
(4, 'Василиса', 'Кац'),
(5, 'Антон', 'Сорокин'),
(6, 'Алёна', 'Алясева'),
(7, 'Антон', 'Белый'),
(8, 'Игорь', 'Маф'),
(9, 'Анастасия', 'Дейчман'),
(10, 'Александр', 'Дмитриев');
CREATE TABLE users_roles (
user_id INTEGER NOT NULL,
role_id INTEGER NOT NULL
);
INSERT INTO users_roles (user_id, role_id)
VALUES
(1, 2),
(2, 1),
(3, 2),
(4, 5),
(5, 3),
(6, 4),
(7, 3),
(8, 3),
(1, 1),
(3, 4),
(5, 1);
| id | first_name | last_name |
|---|---|---|
| 1 | Виктор | Алтушев |
| 2 | Светлана | Иванова |
| 3 | Елена | Абрамова |
| 4 | Василиса | Кац |
| 5 | Антон | Сорокин |
| 6 | Алёна | Алясева |
| 7 | Антон | Белый |
| 8 | Игорь | Маф |
| 9 | Анастасия | Дейчман |
| 10 | Александр | Дмитриев |
| id | name |
|---|---|
| 1 | Менеджер |
| 2 | Дизайнер |
| 3 | Программист |
| 4 | Маркетолог |
| 5 | Бухгалтер |
| user_id | role_id |
|---|---|
| 1 | 2 |
| 2 | 1 |
| 3 | 2 |
| 4 | 5 |
| 5 | 3 |
| 6 | 4 |
| 7 | 3 |
| 8 | 3 |
| 1 | 1 |
| 3 | 4 |
| 5 | 1 |
Решение задачи
SELECT
roles.name as role,
COUNT(users.id) as members
FROM roles
JOIN users_roles ON users_roles.role_id = roles.id
JOIN users ON users.id = users_roles.user_id
GROUP BY role
ORDER BY role ASC
6. Задача - Самые продаваемые товары
Рассмотрим базу данных интернет-магазина:
Также orders связана отношением многие ко многим с таблицей products через таблицу orders_details, что дает возможность указывать какие именно товары находятся в заказе.
Получите 5 самых продаваемых товаров (тех, которых больше всего покупали). Учитывайте только выполненные заказы.
Выведите поля: id и название товара, количество проданных товаров (в поле sold), общую стоимость проданных товаров (в поле total).
Данные отсортируйте сперва по полю sold в обратном порядке, а затем по total, также в обратном порядке.
SET foreign_key_checks = 0;
DROP TABLE IF EXISTS products;
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS orders_details;
SET foreign_key_checks = 1;
CREATE TABLE products (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NULL,
count INTEGER NULL,
price INTEGER NULL
);
INSERT INTO products (id, name, count, price)
VALUES
(1, 'Стиральная машина', 5, 12000),
(2, 'Холодильник', 11, 17800),
(3, 'Микроволновка', 3, 4100),
(4, 'Пылесос', 2, 4500),
(5, 'Вентилятор', 8, 700),
(6, 'Телевизор', 7, 31740),
(7, 'Тостер', 2, 2500),
(8, 'Принтер', 4, 3000),
(9, 'XBOX', 5, 19900),
(10, 'Флешка 8Gb', 14, 700);
CREATE TABLE orders (
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
user_id INT NULL,
date DATETIME NULL,
status VARCHAR(50) NULL
);
INSERT INTO orders (id, user_id, date, status)
VALUES
(1, 7, '2017-01-04 18:23:09', 'success'),
(2, 1, '2017-01-04 18:25:27', 'cancelled'),
(3, 4, '2017-01-12 09:23:14', 'success'),
(4, 10, '2017-01-14 17:16:39', 'new'),
(5, 3, '2017-01-23 17:04:04', 'success'),
(6, 2, '2017-02-01 13:04:47', 'success'),
(7, 1, '2017-02-01 13:32:17', 'success'),
(8, 10, '2017-02-12 08:30:23', 'success'),
(9, 5, '2017-02-12 12:12:43', 'success'),
(10, 2, '2017-02-14 23:21:25', 'success'),
(11, 3, '2017-02-16 14:44:05', 'success'),
(12, 5, '2017-02-28 02:00:47', 'cancelled'),
(13, 10, '2017-03-02 08:53:25', 'new');
CREATE TABLE orders_details (
order_id INTEGER NOT NULL,
product_id INTEGER NOT NULL
);
INSERT INTO orders_details (order_id, product_id)
VALUES
(1, 1),
(2, 2),
(5, 3),
(13, 10),
(8, 7),
(9, 8),
(2, 4),
(5, 5),
(1, 4),
(2, 6),
(5, 6),
(13, 4),
(9, 1),
(9, 2),
(1, 8),
(2, 10),
(3, 9),
(7, 8);
| id | name | count | price |
|---|---|---|---|
| 1 | Стиральная машина | 5 | 12000 |
| 2 | Холодильник | 11 | 17800 |
| 3 | Микроволновка | 3 | 4100 |
| 4 | Пылесос | 2 | 4500 |
| 5 | Вентилятор | 8 | 700 |
| 6 | Телевизор | 7 | 31740 |
| 7 | Тостер | 2 | 2500 |
| 8 | Принтер | 4 | 3000 |
| 9 | XBOX | 5 | 19900 |
| 10 | Флешка 8Gb | 14 | 700 |
| id | user_id | date | status |
|---|---|---|---|
| 1 | 7 | 2017-01-04 18:23:09 | success |
| 2 | 1 | 2017-01-04 18:25:27 | cancelled |
| 3 | 4 | 2017-01-12 09:23:14 | success |
| 4 | 10 | 2017-01-14 17:16:39 | new |
| 5 | 3 | 2017-01-23 17:04:04 | success |
| 6 | 2 | 2017-02-01 13:04:47 | success |
| 7 | 1 | 2017-02-01 13:32:17 | success |
| 8 | 10 | 2017-02-12 08:30:23 | success |
| 9 | 5 | 2017-02-12 12:12:43 | success |
| 10 | 2 | 2017-02-14 23:21:25 | success |
| 11 | 3 | 2017-02-16 14:44:05 | success |
| 12 | 5 | 2017-02-28 02:00:47 | cancelled |
| 13 | 10 | 2017-03-02 08:53:25 | new |
| order_id | product_id |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 5 | 3 |
| 13 | 10 |
| 8 | 7 |
| 9 | 8 |
| 2 | 4 |
| 5 | 5 |
| 1 | 4 |
| 2 | 6 |
| 5 | 6 |
| 13 | 4 |
| 9 | 1 |
| 9 | 2 |
| 1 | 8 |
| 2 | 10 |
| 3 | 9 |
| 7 | 8 |
Решение задачи
SELECT
p.id,
p.name,
COUNT(o.id) as sold,
SUM(p.price) as total
FROM products as p
JOIN orders_details as od on p.id = od.product_id
JOIN orders as o on o.id = od.order_id
WHERE
o.status = 'success'
GROUP BY id
ORDER BY sold DESC, total DESC
LIMIT 5