На INTERVAL, DATE_ADD, DATE_SUB



Для решения задач данного блока вам понадобятся следующие SQL команды и функции: INTERVAL , DATE_ADD , DATE_SUB .

При выборке из таблицы workers прибавьте к дате 1 день. Скрыть решение.

Решение:

SELECT DATE_ADD(date, INTERVAL 1 DAY) FROM workers

При выборке из таблицы workers отнимите от даты 1 день. Скрыть решение.

Решение:

SELECT DATE_ADD(date, INTERVAL -1 DAY) FROM workers

При выборке из таблицы workers прибавьте к дате 1 день, 2 часа. Скрыть решение.

Решение:

SELECT DATE_ADD(date, INTERVAL "1:2" DAY_HOUR) FROM workers

При выборке из таблицы workers прибавьте к дате 1 год, 2 месяца. Скрыть решение.

Решение:

SELECT DATE_ADD(date, INTERVAL "1:2" YEAR_MONTH) FROM workers

При выборке из таблицы workers прибавьте к дате 1 день, 2 часа, 3 минуты. Скрыть решение.

Решение:

SELECT DATE_SUB(date, INTERVAL "1:2:3" DAY_SECOND) FROM workers

При выборке из таблицы workers прибавьте к дате 1 день, 2 часа, 3 минуты, 5 секунд. Скрыть решение.

Решение:

SELECT DATE_SUB(date, INTERVAL "1 2:3:5" DAY_SECOND) FROM workers

При выборке из таблицы workers прибавьте к дате 2 часа, 3 минуты, 5 секунд. Скрыть решение.

Решение:

SELECT DATE_SUB(date, INTERVAL "2:3:5" HOUR_SECOND) FROM workers WHERE

При выборке из таблицы workers прибавьте к дате 1 день и отнимите 2 часа. Скрыть решение.

Решение:

SELECT DATE_ADD(date, INTERVAL 1:-2 DAY_HOUR) FROM workers

При выборке из таблицы workers прибавьте к дате 1 день и отнимите 2 часа, 3 минуты. Скрыть решение.

Решение:

SELECT DATE_ADD(date, INTERVAL 1 -2 -3 DAY_MINUTE) FROM workers

На математические операции

При выборке из таблицы workers создайте новое поле res, в котором будет число 3. Скрыть решение.

Решение:

SELECT 3 AS res FROM workers

При выборке из таблицы workers создайте новое поле res, в котором будет строка 'eee'. Скрыть решение.

Решение:

SELECT "eee" AS res FROM workers

При выборке из таблицы workers создайте новое поле 3, в котором будет число 3. Скрыть решение.

Решение:

SELECT 3 FROM workers

При выборке из таблицы workers создайте новое поле res, в котором будет лежать сумма зарплаты и возраста. Скрыть решение.

Решение:

SELECT SUM(age) AND SUM(salary) AS res FROM workers

При выборке из таблицы workers создайте новое поле res, в котором будет лежать разность зарплаты и возраста. Скрыть решение.

Решение:

SELECT (salary - age) AS res FROM workers

При выборке из таблицы workers создайте новое поле res, в котором будет лежать произведение зарплаты и возраста. Скрыть решение.

Решение:

SELECT (salary * age) AS res FROM workers

При выборке из таблицы workers создайте новое поле res, в котором будет лежать среднее арифметическое зарплаты и возраста. Скрыть решение.

Решение:

SELECT ((salary * age)/2) AS res FROM workers

Выберите из таблицы workers все записи, в которых сумма дня и месяца меньше 10-ти. Скрыть решение.

Решение:

SELECT (MONTH(date) + DAY(date)) FROM workers

На LEFT, RIGHT, SUBSTRING

Для решения задач данного блока вам понадобятся следующие SQL команды и функции: LEFT , RIGHT , SUBSTRING .

При выборке из таблицы workers получите первые 5 символов поля description. Скрыть решение.

Решение:

SELECT LEFT(description, 5) FROM workers

При выборке из таблицы workers получите последние 5 символов поля description. Скрыть решение.

Решение:

SELECT RIGHT(description, 5) FROM workers

При выборке из таблицы workers получите из поля description символы со второго по десятый.Скрыть решение.

Решение:

SELECT SUBSTRING(description, 2,10) FROM workers

На UNION

Для решения задач данного блока вам понадобятся следующие SQL команды и функции: UNION .

Даны две таблицы: таблица category и таблица sub_category с полями id и name. Достаньте одним запросом названия категорий и подкатегорий. Скрыть решение.

Решение:

SELECT id, name FROM workers UNION SELECT id, name FROM sub_category

На CONCAT, CONCAT_WS

Для решения задач данного блока вам понадобятся следующие SQL команды и функции: CONCAT , CONCAT_WS .

При выборке из таблицы workers создайте новое поле res, в котором будут лежать одновременно зарплата и возраст (слитно). Скрыть решение.

Решение:

SELECT CONCAT(salary, age) AS res FROM workers

При выборке из таблицы workers создайте новое поле res, в котором будут лежать одновременно зарплата и возраст (слитно), а после возраста будут идти три знака '!'. Скрыть решение.

Решение:

SELECT CONCAT(salary, age, '!!!') AS res FROM workers

При выборке из таблицы workers создайте новое поле res, в котором будут лежать одновременно зарплата и возраст через дефис. Скрыть решение.

Решение:

SELECT CONCAT_WS('-', salary, age) AS res FROM workers

При выборке из таблицы workers получите первые 5 символов логина и добавьте троеточие.Скрыть решение.

Решение:

SELECT CONCAT (LEFT(login, 5), '...') AS log FROM workers;

На GROUP BY

Для решения задач данного блока вам понадобятся следующие SQL команды и функции: GROUP BY .

Найдите самые маленькие зарплаты по группам возрастов (для каждого возраста свою минимальную зарплату). Скрыть решение.

Решение:

SELECT MIN(salary), MAX(salary) FROM workers GROUP BY age

Найдите самый большой возраст по группам зарплат (для каждой зарплаты свой максимальный возраст). Скрыть решение.

Решение:

SELECT MAX(age) FROM workers GROUP BY salary ;

На GROUP_CONCAT

Для решения задач данного блока вам понадобятся следующие SQL команды и функции: GROUP_CONCAT .

Выберите из таблицы workers уникальные возраста так, чтобы для каждого возраста было поле res, в котором будут лежать через дефис id записей с таким возрастом. Скрыть решение.

Решение:

SELECT DISTINCT age AS res (SELECT GROUP_CONCAT( id SEPARATOR '-') ) FROM workers

На подзапросы

Выберите из таблицы workers все записи, зарплата в которых больше средней зарплаты. Скрыть решение.

Решение:

SELECT * FROM workers WHERE salary >(SELECT AVG(salary) FROM workers)

Выберите из таблицы workers все записи, возраст в которых меньше среднего возраста, деленного на 2 и умноженного на 3. Скрыть решение.

Решение:

SELECT * FROM workers WHERE age < (SELECT AVG(age)/2*3 FROM workers)

Выберите из таблицы workers записи с минимальной зарплатой. Скрыть решение.

Решение:

SELECT * FROM workers WHERE salary = (SELECT MIN(salary) FROM workers)

Выберите из таблицы workers записи с максимальной зарплатой. Скрыть решение.

Решение:

SELECT * FROM workers WHERE salary = (SELECT MAX(salary) FROM workers)

При выборке из таблицы workers создайте новое поле max, в котором будет лежать максимальное значение зарплаты для возраста 25 лет. Скрыть решение.

Решение:

SELECT MAX(salary) AS max FROM workers WHERE age = 25 !!!!!!

При выборке из таблицы workers создайте новое поле avg, в котором будет лежать деленная на 2 разница между максимальным значением возраста и минимальным значением возраста в во всей таблице. Скрыть решение.

Решение:

SELECT (SELECT (MAX(age) - MIN(age))/2 FROM workers) AS avg

При выборке из таблицы workers создайте новое поле avg, в котором будет лежать деленная на 2 разница между максимальным значением зарплаты и минимальным значением зарплаты для возраста 25 лет. Скрыть решение.

Решение:

SELECT (SELECT (MAX(age) - MIN(age))/2 FROM workers ) AS avg FROM workers WHERE age = 25

На JOIN

Для решения задач данного блока вам понадобятся следующие SQL команды и функции: JOIN .

Даны две таблицы: таблица category с полями id и name и таблица page с полями id, name и category_id. Достаньте одним запросом все страницы вместе с их категориями. Скрыть решение.

Решение:

SELECT * FROM page LEFT JOIN category ON page.catogory_id = category.id

Даны 3 таблицы: таблица category с полями id и name, таблица sub_category с полями id и name и таблица page с полями id, name и sub_category_id. Достаньте одним запросом все страницы вместе с их подкатегориями и категориями. Скрыть решение.

Решение:

SELECT * FROM page LEFT JOIN category ON page.catogory_id = category.idLEFT JOIN sub_category ON category.id = sub_category.category_id

На работу с полями

Задачи данного блока следует решать SQL запросами, а не через PhpMyAdmin.

Создайте базы данных test1 и test2. Скрыть решение.

Решение:

CREATE DATABASE test1CREATE DATABASE test2

Удалите базу данных test2. Скрыть решение.

Решение:

DROP DATABASE test2

Создайте в базе данных test1 таблицы table1 и table2 с полями id, login, salary, age, date. Скрыть решение.

Решение:

CREATE TABLE table1( id INT(1), login VARCHAR(255), salary INT(6), age INT(6), date DATE NOT NULL primary key (Id));CREATE TABLE table2( id INT(1), login VARCHAR(255), salary INT(6), age INT(6), date DATE NOT NULL primary key (Id));

Переименуйте таблицу table2 в table3. Скрыть решение.

Решение:

RENAME TABLE table2 TO table3

Удалите таблицу table3. Скрыть решение.

Решение:

DROP TABLE table3

Добавьте в таблицу table1 поле status. Скрыть решение.

Решение:

ALTER TABLE table1 ALTER COLUMN status

Удалите из таблицы table1 поле age. Скрыть решение.

Решение:

ALTER TABLE table1 DROP COLUMN age

Переименуйте поле login на user_login. Скрыть решение.

Решение:

 RENAME COLUMN login TO user_login

Смените типа поля salary с int на varchar(255). Скрыть решение.

Решение:

ALTER TABLE table1 CHANGE salary salary VARCHAR(255)

Очистите таблицу table1. Скрыть решение.

Решение:

DELETE FROM table1

Очистите все таблицы базы данных test1. Скрыть решение.

Решение:

TRUNCATE test1

 

Простое связывание

Товар (название, цена, количество), категория товара. Запросы: (1) достать товары вместе с категориями, (2) достать товары из категории 'Овощи', (3) достать товары из категорий 'Овощи', 'Мясо', 'Морепродукты', (4) достать все категории (без товаров, только названия категорий), (5) достать все категории, в которых есть товары (без товаров, только названия категорий, без дублей).Скрыть решение.

Решение:

Таблицы:

таблица goods (товар), поля: id, name (название), quantity (количество), price (цена), category_id (айди категории)
таблица category (категория), поля: id, name (название)

Запросы:

#1. достать товары вместе с категориями:

SELECT * FROM goods LEFT JOIN category ON goods.categoryId = category.id

#2. достать товары из категории 'Овощи':

SELECT * FROM goods INNET JOIN category ON goods.categoryId = category.id WHERE category.name = "Овощи"

#3. достать товары из категорий 'Овощи', 'Мясо', 'Морепродукты':

SELECT * FROM goods INNET JOIN category ON goods.categoryId = category.id WHERE category.name IN ('Овощи', 'Мясо', 'Морепродукты')

#4. достать все категории (без товаров, только названия категорий):

SELECT name FROM category

#5. достать все категории, в которых есть товары (без товаров, только названия категорий, без дублей):

SELECT DISTINCT name FROM category INNER JOIN 'goods' ON category.Id = goods.category_id

Товар (название, цена, количество), подкатегория товара, категория товара. Товар принадлежит подкатегории, подкатегория — категории. Пример: помидорки черри (товар), помидоры (подкатегория), овощи (категория). Запросы: (1) достать товары вместе с подкатегориями и категориями, (2) достать товары из подкатегории 'Помидоры', (3) достать все подкатегории категории 'Овощи'. Скрыть решение.

Решение:

Таблицы:

таблица goods (товар), поля: id, name (название), quantity(количество), price(цена), sub_category_id (айди подкатегории)
таблица sub_category (подкатегория), поля: id, name (название), price (цена), category_id (айди категории)
таблица category (категория), поля: id, name (название)

Запросы:

#1. достать товары вместе с категориями:

SELECT goods.name, goods.quantity, goods.price, subcategory.name, category.name FROM goods goods

JOIN subcategory ON goods.subcategoryId = subcategory.id JOIN category ON subcategory.categoryId = category.id

#2. достать товары из категории 'Овощи':

SELECT * FROM goods INNET JOIN subcategory ON goods.subcategoryId = subcategory.categoryId JOIN category ON subcategory.categoryId = category.id; WHERE category.name = "Овощи"

#3. достать товары из категорий 'Овощи', 'Мясо', 'Морепродукты':

SELECT * FROM goods INNET JOIN subcategory ON goods.subcategoryId = subcategory.categoryId JOIN category ON

subcategory.categoryId = category.id; WHERE category.name IN ('Овощи', 'Мясо', 'Морепродукты')

Товар, категория, склад, брэнд. Товар принадлежит категории, складу и бренду. Запросы: (1) достать товары с их категорией, складом и брэндом, (2) достать все склады. Скрыть решение.

Решение:

Таблицы:

таблица goods (товар), поля: id (идентификатор), name (название), quantity (количество), price (цена), category_id (айди категории)
таблица category (категория), поля: id (идентификатор), name (название), stock_id (айди склада)
таблица stock (склад), поля: id, name (название), brand_id (ай ди брэнда)
таблица brand (брэнд), поля: id, name (название)

Запросы:

#1. достать товары с их категорией, складом и брэндом:

SELECT * FROM goods LEFT JOIN category ON goods.categoryId = category.id

LEFT JOIN stock ON categoty.stockId = stock.id

LEFT JOIN brand ON stock.brandId= brand.id

#2. достать все склады:

SELECT * FROM stock

Товар, подкатегория, категория, склад, брэнд. Последние 3 никак не связаны, подкатегория принадлежит категории (например, помидоры овощам). Запросы: (1) достать товары с их подкатегорией и категорией, складом и брэндом. Скрыть решение.

Решение:

Таблицы:

таблица goods (товар), поля: id, name (название), quantity (количество), price (цена), subcategory_id (айди подкатегории)
таблица subcategory (подкатегория), поля: id, name (название), price (цена), category_id (айди категории)
таблица category (категория), поля: id, name (цена)
таблица stock (склад), поля: id, name (название)
таблица brand (брэнд), поля: id, name (название)

Запросы:

#1. достать товары с их категорией, складом и брэндом:

SELECT goods.name, goods.quantity, goods.price, subcategory.name, category.name

FROM goods JOIN subcategory ON goods.subcategoryId = subcategory.id

               JOIN category ON subcategory.categoryId = category.id               UNION SELECT * FROM stock UNION SELECT * FROM brand

Пользователь, его город. Запросы: (1) достать пользователей вместе с их городом, (2) достать все города, (3) достать всех пользователей из города Минск, (4) достать все города, в которых есть пользователи, (5) достать все города, в которых нет пользователей, (6) вывести список городов с количеством пользователей в них, (7) вывести список городов, в которых количество пользователей больше трех. Скрыть решение.

Решение:

Таблицы:

таблица user (пользователь), поля: id, name (название), city_id (айди города)
таблица city (город), поля: id, name (название)

Запросы:

#1. достать пользователей вместе с их городом:

SELECT user.id, user.name, city.id, city.name FROM user LEFT JOIN city ON user.cityId = city.id

#2. достать все города:

SELECT name FROM city

#3. достать всех пользователей из города Минск:

SELECT user.id, user.name FROM user LEFT JOIN city ON user.cityId = city.id WHERE city.name = "Минск"

#4. достать всех пользователей из города Минск:

SELECT user.id, user.name FROM user LEFT JOIN city ON user.cityId = city.id WHERE user.cityId IS NOT NULL

#5. достать всех пользователей из города Минск:

SELECT user.id, user.name FROM user LEFT JOIN city ON user.cityId = city.id WHERE user.cityId IS NULL

#6. вывести список городов с количеством пользователей в них:

SELECT city.name, COUNT(user.cityId) AS cityUsers FROM city RIGHT JOIN user ON city.id = user.cityId

#7. вывести список городов, в которых количество пользователей больше трех:

SELECT city.name, COUNT(user.cityId) AS cityUsers FROM city RIGHT JOIN user ON city.id = user.cityId WHERE COUNT(user.cityId) > 3

Пользователь, его город, страна. Запросы: (1) достать всех пользователей вместе с их городом и страной, (2) достать все города с их странами, (3) достать всех пользователей из страны Беларусь (без городов), (4) достать всех пользователей из города Минск (без страны), (5) вывести список стран с количеством пользователей в них. Скрыть решение.

Решение:

Таблицы:

таблица user (пользователь), поля: id, name (название), city_id (айди города)
таблица city (город), поля: id, name (назваие), country_id (айди страны)
таблица country (страна), поля: id, name (название)

Запросы:

#1. достать пользователей вместе с их городом:

SELECT user.name, city.name, country.name FROM user LEFT JOIN city ON user.cityId = city.id LEFT JOIN country ON city.countryId = country.id

#2. достать все города с их странами:

SELECT city.name, country.name FROM city LEFT JOIN country ON city.countryId = country.id

#3. достать всех пользователей из страны Беларусь (без городов):

SELECT user.name FROM user LEFT JOIN city ON user.cityId = city.id LEFT JOIN country ON city.countryId = country.id WHERE country.name = "Беларусь"

#4. достать всех пользователей из города Минск :

SELECT user.name FROM user LEFT JOIN city ON user.cityId= city.id WHERE city.name = "Минск"

#5. вывести список стран с количеством пользователей в них :

SELECT country.name, COUNT(cityId) AS userCountry FROM country INNER JOIN city ON country.id = city.countryid INNER JOIN user ON city.id = user.cityId

Сложные связи

У отца всегда только один сын. Сыновья в свою очередь также могут быть отцами. Запросы: (1) получить пользователя вместе с его отцом и сыном, (2) получить дедушку пользователя, (3) получить прадедушку пользователя. Скрыть решение.

Решение:

Таблицы:

таблица user (пользователь), поля: id, name (имя), son_id (айди сына)

Запросы:

#1. получить пользователя вместе с его отцом и сыном:

SELECT *, sons.name FROM user LEFT JOIN user AS sons ON user.sonId = sons.id

#2. получить дедушку пользователя:

SELECT *, grandfather.name FROM user LEFT JOIN user AS father ON user.sonId = father.id LEFT JOIN user AS grandfather ON user.id = grandfather.sonId

#3. получить прадедушку пользователя:

SELECT *, greatfather.name FROM user LEFT JOIN user AS father ON user.sonId = father.id LEFT JOIN user AS grandfather ON

 user.id = grandfather.sonId LEFT JOIN user AS greatfather ON user.sonId = greatfather.id

Есть мужья и жены, а также неженатые/незамужние. Для всех указывается имя, фамилия, возраст, адрес. Муж с женой имеют одну фамилию и живут по одному адресу. Запросы: (1) получить мужей с женами и наоборот, (2) получить холостых, (3) получить семьи (муж+жена), семьи не должны дублироваться (пара должна быть только 1 раз). Скрыть решение.

Решение:

Таблицы:

таблица user (пользователь), поля: id, name (имя), surname (фамилия), age (возраст), address (адрес), family_id (айди семьи)

Запросы:

#1. получить мужей с женами и наоборот:

SELECT * FROM user LEFT JOIN user AS relations ON user.id = relation.famili_id WHERE user.surname = relations.surname

#2. получить холостых:

SELECT * FROM user LEFT JOIN user AS relations ON user.id = relation.famili_id WHERE famili_id IS NULL

#3. получить семьи (муж+жена), семьи не должны дублироваться (пара должна быть только 1 раз):

SELECT DISTINC user.name, relations.name FROM user LEFT JOIN user AS relations ON user.id = relation.famili_id WHERE user.surname = relation.surname

Еще более сложные

Товар, который может принадлежать нескольким категориям одновременно. Запросы: (1) достать все товары вместе с их категориями, (2) достать товар 'Огурец' вместе с его категориями, (3) достать все товары из категории 'Овощи', (4) достать все товары, которые принадлежат более чем одной категории. Скрыть решение.

Решение:

Таблицы:

таблица product (продукт), поля: id, name (название), product_id (айди продукта)
таблица order (порядок), поля: id, product_id, category_id (айди категории)
таблица category (категория), поля: id, name (название),

Запросы:

#1. достать все товары вместе с их категориями:

SELECT * FROM product LEFT JOIN order ON prdouct.category.id = order.id LEFT JOIN category ON order.category_id = category.id

#2. достать товар 'Огурец' вместе с его категориями:

SELECT *, category.name FROM product LEFT JOIN order ON prdouct.category.id = order.id LEFT JOIN category

 ON order.category_id = category.id WHERE product.name = "Огурец"

#3. достать все товары из категории 'Овощи':

SELECT * FROM product LEFT JOIN order ON prdouct.category.id = order.id LEFT JOIN category ON order.category_id = category.id WHERE categoty.name = "Овощи"

#4.достать все товары, которые принадлежат более чем одной категории.:

SELECT * FROM product LEFT JOIN order ON prdouct.category.id = order.id LEFT JOIN category ON order.category_id = category.id WHERE

Пользователь и его интересы (могут быть одинаковыми у разных пользователей). Запросы: (1) достать интересы пользователя, (2) достать всех пользователей с данным интересом. Скрыть решение.

Решение:

Таблицы:

таблица user (пользователь), поля: id, name (имя), user_id (айди пользователя)
таблица order (порядок), поля: id, user_id (айди пользователя), interests_id (айди интереса)
таблица interests (интерес), поля: id, name (название),

Запросы:

#1. достать интересы пользователя:

SELECT *, intrests.name FROM user LEFT JOIN order ON user.user_id = order.id LEFT JOIN interests ON order.interests_id = interest.id WHERE user.id = 2

#1. достать всех пользователей с данным интересом:

SELECT * FROM user LEFT JOIN order ON user.user_id = order.id LEFT JOIN interests ON order.interests_id = interest.id WHERE intrests.id = 2

Пользователь, товары, покупки пользователей. У товара есть цена, пользователь может купить не один экземпляр товара, а одновременно несколько. Запросы: (1) вывести пользователей вместе с их покупками, (2) вывести пользователей вместе с суммами всех их покупок, (3) найти суммарные покупки на сайте за определенный месяц, (4) найти суммарные покупки на сайте помесячно (то есть результат будет в таком виде: март 2010 — сумма1, апрель 2010 — сумма2, май 2010 — сумма3 и тд). Скрыть решение.

Решение:

Таблицы:

таблица product (товар), поля: id, name (название), price (цена), date (дата), product_id (айди продукта)
таблица purchase (покупка), поля: id, name (название), user_id (айди пользователя), product_id (айди продукта)
таблица user (пользователь), поля: id, name (имя)

Запросы:

#1. вывести пользователей вместе с их покупками:

SELECT *, user.name FROM product LEFT JOIN purchase ON product.product_id = purchase.id LEFT JOIN user ON

 purchase.user_id = user.id

#2. вывести пользователей вместе с суммами всех их покупок:

SELECT *, user.name, SUM(price) FROM product LEFT JOIN purchase ON product.product_id = purchase.id LEFT JOIN user ON purchase.user_id = user.id

#3. найти суммарные покупки на сайте за определенный месяц:

SELECT SUM(price) FROM product LEFT JOIN purchase ON product.product_id = purchase.id LEFT JOIN user ON

 purchase.user_id = user.id WHERE MONTH(date) = 2

#4. найти суммарные покупки на сайте помесячно:

SELECT SUM(price) AS sum, DATE_FORMAT(date, '%m-%Y') user.name FROM product LEFT JOIN purchase ON

 product.product_id = purchase.id LEFT JOIN user ON purchase.user_id = user.id

Есть отцы и сыновья. У отца может быть много сыновей. Запросы: (1) получить всех сыновей пользователя, (2) получить отца пользователя, (3) получить дедушку пользователя, (4) получить внуков пользователя. Скрыть решение.

Решение:

Таблицы:

таблица user (пользователь), поля: id, name (имя), user_id (айди человека)
таблица order (порядок), поля: id, user_id (айди человека), son_id (айди сина)
таблица son (интерес), поля: id, name (название),

Запросы:

#1. получить всех сыновей пользователя:

SELECT * FROM user LEFT JOIN order ON user.user_id = order.id LEFT JOIN son ON order.son_id = son.id

#2. получить отца пользователя :

SELECT user.name AS fatherName FROM user LEFT JOIN order ON user.user_id = order.id LEFT JOIN son ON order.son_id = son.id WHERE user.id = 2

#3. получить дедушку пользователя :

SELECT user.name AS fatherName FROM user LEFT JOIN order ON user.user_id = order.id LEFT JOIN son ON order.son_id = son.id WHERE user.id = 2

Море, реки, притоки (притоки делятся на правые и левые). Реки могут быть притоками других рек или впадать прямо в море. Запросы: (1) получить все реки Черного Моря, (2) получить все реки Черного Моря вместе с притоками, (3) получить все притоки реки Днепр, (4) получить куда впадает данная река (в какую реку или в какое море). Скрыть решение.

Решение:

Таблицы:

таблица river (река), поля: id, name (название), trid_id (айди притока)
таблица tributaries (приток), поля: id, name (название), sea_id (айди моря), river_id (айди реки)
таблица sea (море), поля: id, name (название)

Запросы:

#1. получить все реки Черного Моря :

SELECT river.name FROM river LEFT JOIN tributaries ON river.trid_id = tributaries.id LEFT JOIN sea ON

 tributaires.swa_id = sea.id WHERE sea.name = "Черное Море"

#2. получить все реки Черного Моря вместе с притоками :

SELECT river.name, tributaries.name FROM river LEFT JOIN tributaries ON

river.trid_id = tributaries.id LEFT JOIN sea ON tributaires.swa_id = sea.id WHERE sea.name = "Черное Море"

#3. получить все притоки реки Днепр :

SELECT tributaries.name FROM river LEFT JOIN tributaries ON river.trid_id = tributarie.id WHERE river.name = "Днепр"

#4. получить куда впадает данная река (в какую реку или в какое море):

SELECT river.name, sea.name FROM river LEFT JOIN tributaries ON river.trid_id = tributaries.id LEFT JOIN sea ON tributaires.swa_id = sea.id WHERE river.id = 1

Закрепление

Пользователь, обмен сообщениями между пользователями (в личку). Сообщение можно пометить как прочитанное (это может только получатель сообщения). Скрыть решение.

Решение:

Таблицы:

таблица message (сообщение), поля: id, user_id (айд пользователя), author_id (айди автора), text (текст), status (статус)

Запросы:

SELECT * FROM massage LEFT JOIN message AS order_message ON massage.user_id = order_message.author_id WHERE status = 1

Есть сайт с датами футбольных игр. В каждой игре нужно выводить дату игры, первую команду и вторую команду. После того, как игра прошла — нужно выводить еще и счет. Запросы: (1) получить все игры вместе с командами, (2) получить все игры с командами за текущий месяц, (3) получить все игры с командами за предыдущий месяц, (4) получить все сыгранные игры, (5) получить все несыгранные игры. Скрыть решение.

Решение:

Таблицы:

таблица game (игра) поля: id, team1_id (айди 1й команды), team2_id (айдм 2й команды), date (дата), status (статус)
таблица team (команда) поля: id, name (название)

Запросы:

#1. получить все игры вместе с командами :

SELECT * FROM game INNER JOIN team ON game.team1_id= team.id UNION SELECT * FROM game INNER JOIN team ON

 game.team2_id = team.id

#2. получить все игры с командами за текущий месяц:

SELECT * FROM game INNER JOIN team ON game.team1_id= team.id UNION SELECT * FROM game INNER JOIN team ON

game.team2_id = team.id WHERE MONTH(date)= MONTH(NOW())

#3. получить все игры с командами за предыдущий месяц:

SELECT * FROM game INNER JOIN team ON game.team1_id= team.id UNION SELECT * FROM game INNER JOIN team ON

 game.team2_id = team.id WHERE MONTH(date)= MONTH(DATE_ADD(), INTERVAL -1 MONTH)

#4. получить все сыгранные игры:

SELECT * FROM game INNER JOIN team ON game.team1_id= team.id UNION SELECT * FROM game INNER JOIN team ON

 game.team2_id = team.id WHERE status IS NOT NULL

#5. получить все несыгранные игры:

SELECT * FROM game INNER JOIN team ON game.team1_id= team.id UNION SELECT * FROM game INNER JOIN team ON

 game.team2_id = team.id WHERE status IS NULL

Модифицируем предыдущую задачу так, чтобы выводился также город, в котором будет игра. Каждая команда принадлежит своему городу (игра может быть в городе одной из команд). Добавьте еще и игроков, каждый игрок может принадлежать одной команде. Скрыть решение.

Решение:

Таблицы:

таблица player (команда) поля: id, name (название), team_id (айди команды)
таблица game (игра) поля: id, team1_id (айди 1й команды), team2_id (айди 2й команды), date (дата), game_city (игра в городе), status (статус)
таблица team (команда) поля: id, name (название), city (город)

Запросы:

#1. получить все командами c городами :

SELECT *, team.city FROM game INNER JOIN team ON game.team1_id= team.id UNION SELECT * FROM game INNER JOIN team ON game.team2_id = team.id

#2. получить всех играков команды :

SELECT * FROM player LEFT JOIN team ON player.team_id = team.id 

Пользователь, страницы, категории страниц. Пользователи пишут посты в гостевой книге к определенной странице. Запросы: (1) получить все комментарии к данной странице, (2) получить все комментарии данного пользователя Скрыть решение.

Решение:

Таблицы:

таблица user (пользователь) поля: id, name (имя), text (текст), page_id (айди страницы)
таблица page (страница) поля: id, name (название), category_id (айди категории)
таблица category (категория страницы) поля: id, name (название)

Запросы:

#1. получить все комментарии к данной странице:

SELECT * FROM user INNER JOIN page ON user.pade_id = page.id INNER JOIN category ON page.category_id = category.id

#2. получить все комментарии данного пользователя:

SELECT * FROM user INNER JOIN page ON user.pade_id = page.id INNER JOIN category ON page.category_id = category.id WHERE user.id = 1

Проекты

Форум, категории, в них темы (тема принадлежит только одной категории), в темах посты. У темы есть автор. Пользователи могут обмениваться личными сообщениями. Скрыть решение.

Решение:

Таблицы:

таблица post (запись) поля: id, nam (название), text (текст), topic_id (айди темы)
таблица topic (тема) поля: id, name (название), category_id (айди категории)
таблица category (категория) поля: id, name (название)

Запросы:

#1. получить все посты :

SELECT * post LEFT JOIN topic ON post.topic_id = topic.id LEFT JOIN category ON topic.category_id = category.id

Социальная сеть, пользователи, их друзья, стена, комментарии к записям на стене. Пользователи могут обмениваться личными сообщениями. Скрыть решение.

Решение:

Таблицы:

таблица user (пользователь), поля: id, name (имя), text (текст), topic_id (айди темы)

Запросы:

#1. получить все посты :

SELECT * post LEFT JOIN topic ON post.topic_id = topic.id LEFT JOIN category ON topic.category_id = category.id

Сайт с одеждой. Каждый товар может быть разного цвета, количество цветов может быть любым. Пример - товар: джинсы, цвета: синий, голубой, зеленый. Запросы (1): получить товары вместе с их цветами. Цвета должны быть в отдельной колонке через запятую, товары не должны дублироваться. Скрыть решение.

Решение:

Таблицы:

таблица product (товар) поля: id, name (название), color_id (айди цвета)
таблица color (цвет) поля: id, name (название)

Запросы:

#1. получить товары вместе с их цветами :

SELECT DISTINCT product.id, product.name, color.name AS color FROM product INNER JOIN color ON

product.color_id = color.id

Сайт с опросами (опросов много). Пользователи отвечают на вопросы опроса. На сайте нужно выводить результаты опроса. Пользователи видят в личном кабинете вопросы, на которые они отвечали, и то, как они на них отвечали. Скрыть решение.

Решение:

Таблицы:

таблица interview (опрос) поля: id, name (название), text (текст), user_id (айди пользователя), status (статус)
таблица user (пользователь) поля: id, name (имя)

Запросы:

#1. вопросы на которые отвечали:

SELECT * FROM interview LEFT JOIN user ON interview.user_id = user.id WHERE status IS NOT NULL

#1. вопросы на которые не отвечали:

SELECT * FROM interview LEFT JOIN user ON interview.user_id = user.id WHERE status IS NULL

Дерево категорий. Каждая категория может принадлежать любой надкатегории, та в свою очередь наднадкатегории и так далее. Скрыть решение.

Решение:

Таблицы:

таблица category (категория) поля: id, name (название), category_id (айди категории)

Запросы:

#1. получить все категории:

 SELECT * FROM category LEFT JOIN category AS subcategory ON category.category_id = subcategory.id LEFT JOIN category AS overcategory ON subcategory.category_id = overcategory.id

Генеологическое дерево. Пользователь, его бабушки, дедушки, мама, папа, братья, сестры, дети. Можно найти любого родственника в любом колене (например, пра-пра-пра-дедушку). То есть есть пользователь, он может быть сыном, отцом, братом, дедушкой, прадедушкой и все это одновременно. Нужно хранить и получать родственные связи. Запросы: (1) получить отца пользователя, (2) получить мать пользователя, (3) получить детей пользователя, (4) получить сыновей пользователя, (5) получить дочерей пользователя, (6) получить внуков пользователя, (7) получить бабушек пользователя, (8) получить дедушек пользователя, (9) получить пра-пра-пра-дедушку пользователя, (10) получить братьев и сестер пользователя, (11) получить братьев пользователя, (12) получить дядь и теть пользователя, (13) получить кузенов и кузин пользователя.Скрыть решение.

Решение:

Таблицы:

таблица user (пользователь), поля: id, name (имя), mother_id (айди матери), father_id (айди отца), sex (стать)

Запросы:

#1. получить отца пользователя :

SELECT father.name FROM user LEFT JOIN user AS father user.father_id = father.id

#2. получить мать пользователя :

SELECT mother.name FROM user LEFT JOIN user AS mother user.mother_id = mother.id

#3. получить детей пользователя :

SELECT * FROM user LEFT JOIN user AS father user.father_id = father.id LEFT JOIN user AS mother user.mother_id = mother.id WHERE father_id = 1 AND mother.id =1

#4. получить сыновей пользователя :

SELECT * FROM user LEFT JOIN user AS father user.father_id = father.id LEFT JOIN user AS mother user.mother_id = mother.id WHERE user.sex = 1

#5. получить дочерей пользователя :

SELECT * FROM user LEFT JOIN user AS father user.father_id = father.id LEFT JOIN user AS mother user.mother_id = mother.id WHERE user.sex = 2

#6. получить внуков пользователя :

SELECT * FROM user LEFT JOIN user AS father user.father_id = father.id LEFT JOIN user AS mother user.mother_id = mother.id LEFT JOIN user AS grendfather ON father.father_id = grendfather.id LEFT JOIN user AS grendmother ON mother.mother_id = grendmother.id

#7. получить бабушек пользователя :

SELECT *, grendmother.name FROM user LEFT JOIN user AS father user.father_id = father.id LEFT JOIN user AS mother user.mother_id = mother.id LEFT JOIN user AS grendfather ON father.father_id = grendfather.id LEFT JOIN user AS grendmother ON mother.mother_id = grendmother.id

#8. получить дедушек пользователя :

SELECT *, grendfather.name FROM user LEFT JOIN user AS father user.father_id = father.id LEFT JOIN user AS mother user.mother_id = mother.id LEFT JOIN user AS grendfather ON father.father_id = grendfather.id LEFT JOIN user AS grendmother ON mother.mother_id = grendmother.id

#9. получить дедушек пользователя :

SELECT *,aovergrendfather.name FROM user LEFT JOIN user AS father user.father_id = father.id LEFT JOIN user AS mother user.mother_id = mother.id LEFT JOIN user AS grendfather ON father.father_id = grendfather.id LEFT JOIN user AS grendmother ON mother.mother_id = grendmother.id LEFT JOIN user AS aovergrendfather ON grendfather.father_id = overgrendfather.id

#10. получить братьев и сестер пользователя :

SELECT user.name AS relatives FROM user LEFT JOIN user AS father user.father_id = father.id LEFT JOIN user AS mother user.mother_id = mother.id

#11. получить братьев пользователя :

SELECT user.name AS relatives FROM user LEFT JOIN user AS father user.father_id = father.id LEFT JOIN user AS mother user.mother_id = mother.id WHERE user.sex = 1

#12. получить братьев пользователя :

SELECT user.name AS relatives FROM user LEFT JOIN user AS father user.father_id = father.id LEFT JOIN user AS mother user.mother_id = mother.id WHERE user.sex = 2

#13. получить кузенов и кузин пользователя :

Как реализовать?

Блокировка и разблокировка пользователя администратором сайта. Скрыть решение.

Решение:

UPDATE table1 SET status= 1 WHERE id = 2

UPDATE table1 SET status= 0 WHERE id = 2

Блокировка пользователя на неделю или месяц. После истечения срока пользователь отблокируется автоматически. Скрыть решение.

Решение:

UPDATE table1 SET block=(DATE_ADD(date, INTERVAL 1 MONTH)) WHERE id = 2
UPDATE table1 SET block= 0 WHERE id = 2

 


Дата добавления: 2018-09-20; просмотров: 914; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!