**کوئریهای شما باید روی _MySQL_ قابل اجرا باشند.**
---
![مسابقهی محله](https://quera.ir/qbox/view/kTNAcFnRmN/mosabeghe-mahale.png)
مسعود قصد دارد مسابقهی محله را اینبار بهصورت آنلاین برگزار کند. او این مسابقات را برگزار کرده و دادههایی را جمعآوری کرده، اما متأسفانه برای کار با این دادهها ناتوان است.
برای این کار به او کمک کنید.
# جزئیات پروژه
دادههای اولیه برای تست نمونه را از [این لینک](/contest/assignments/35053/download_problem_initial_project/127094/) دانلود کنید.
ساختار جداول بهشرح زیر است:
**جدول `users`**: از این جدول برای نگهداری اطلاعات کاربران استفاده میشود. ساختار این جدول بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------|:--|----:|
|`id`|`BIGINT`|شناسهی کاربر|
|`name`|`VARCHAR(255)`|نام کاربر|
**جدول `contests`**: از این جدول برای نگهداری اطلاعات مسابقات استفاده میشود. ساختار این جدول بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------|:--|----:|
|`id`|`BIGINT`|شناسهی مسابقه|
|`title`|`VARCHAR(255)`|عنوان مسابقه|
**جدول `problems`**: از این جدول برای نگهداری سؤالات مسابقات استفاده میشود. ساختار این جدول بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------|:--|----:|
|`id`|`BIGINT`|آیدی|
|`contest_id`|`VARCHAR(255)`|آیدی مسابقه|
|`title`|`VARCHAR(255)`|عنوان سوال|
**جدول `submissions`**: از این جدول برای نگهداری ارسالهای کاربران برای سؤالات مسابقات استفاده میشود. ساختار این جدول بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------|:--|----:|
|`id`|`BIGINT`|شناسهی ارسال|
|`user_id`|`BIGINT`|شناسهی کاربر|
|`problem_id`|`BIGINT`|شناسهی سؤال|
|`score`|`BIGINT`|امتیاز لحاظشده برای ارسال|
همانطور که در ساختار جداول مشاهده میکنید، هر مسابقه دارای سؤالاتی است و هر کاربر میتواند برای این سؤالات راهحل ارسال کند و امتیاز کسب کنند.
در انتها باید بدانید که جدول امتیازات با در نظر گرفتن بیشترین امتیاز کاربر بهدست میآید، یعنی ممکن است یک کاربر برای یک سؤال چند ارسال داشته باشد. در اینصورت، باید بیشترین امتیاز او برای رتبهبندی در نظر گرفته شود.
# مطلوبات
کوئریهای زیر را طوری بنویسید که خروجی خواستهشده بهدست بیاید:
1. لیست چالشیترین سؤالات مسابقات: سؤالات مسابقات بهترتیب نزولی تعداد ارسال برای آنها؛ در خروجی باید عنوان سؤال بههمراه عنوان مسابقهی مربوط به آن بهترتیب در قالب ستونهای `p_title` و `c_title` وجود داشته باشد. در صورتی که تعداد ارسالهای مربوط به دو ردیف برابر بود، باید ابتدا براساس `p_title` و سپس براساس `c_title` بهصورت صعودی مرتب شوند.
2. لیست مسابقات بهترتیب نزولی تعداد شرکتکننده: در خروجی باید عنوان مسابقه در قالب ستونی با نام `title` به همراه تعداد شرکتکنندهها در قالب ستونی با نام `amount` وجود داشته باشد. درصورتی که تعداد شرکتکنندههای دو ردیف برابر باشد، باید براساس `title` بهصورت صعودی مرتب شوند.
3. جدول امتیازات مسابقهای با عنوان `mahale`: برای جدول امتیازات باید ستونهای نام کاربر با نام `name` بههمراه امتیاز او با نام `score` وجود داشته باشد. درصورتی که امتیاز دو ردیف برابر باشد، باید براساس `name` بهصورت صعودی مرتب شوند.
4. پرافتخارترین نفرات در همهی مسابقات: در خروجی باید نام شرکتکننده با نام `name` بههمراه امتیاز کل آن با نام `score` وجود داشته باشد. درصورتی که امتیاز دو ردیف برابر باشد، باید براساس مقدار ستون `name` بهصورت صعودی مرتب شوند.
5. کوئریای بنویسید که عنوان مسابقهای با عنوان `mahale` را به `Mosabeghe Mahale` تغییر دهد.
6. کوئریای بنویسید که تمامی مسابقاتی که ارسالی برای آنها وجود ندارد را حذف کند.
# آنچه باید آپلود کنید
پس از طراحی کوئریها، کد خود را در قالب زیر در یک فایل با پسوند `.sql` آپلود کنید.
```sql
-- Section1
Your first query here
-- Section2
Your second query here
-- Section3
Your third query here
-- Section4
Your fourth query here
-- Section5
Your fifth query here
-- Section6
Your sixth query here
```
**کوئریهای شما باید روی _MySQL_ قابل اجرا باشند.**
---
یکی از تیمهای فنی گروه اسنپ قصد دارد برخی از کوئریهای خود که مربوط به بخش سفارشها هستند را با استفاده از ایندکسها سریعتر کند. به آنها در این کار کمک کنید.
# جزئیات پروژه
دادههای سؤال را از [این لینک](/contest/assignments/35053/download_problem_initial_project/127095/) دانلود کنید.
جدولی با نام `orders` برای نگهداری اطلاعات سفارشها موجود است که ساختار آن به شرح زیر است:
|نام ستون|نوع|تعریف|
|:-------|:--|----:|
|`id`|`BIGINT(20)`|شناسهی سفارش|
|`user_id`|`BIGINT(20)`|شناسهی کاربر سفارشدهنده|
|`total`|`DECIMAL(10,2)`|مبلغ سفارش|
|`created_at`|`DATETIME`|زمان ثبت سفارش|
# مطلوبات
کوئریهای *SQL* خواستهشده از شما، موارد زیر است:
1. کوئری ساخت ایندکس جهت بهینهسازی حداکثری سرعت محاسبهی مجموع مبلغ سفارشها در سال ۲۰۲۰:
```sql
SELECT SUM(total)
FROM orders
WHERE created_at BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59'
```
2. کوئری ساخت ایندکس جهت بهینهسازی حداکثری سرعت محاسبهی مجموع مبلغ سفارشهای کاربری با شناسهی ۳۴۵ در سال ۲۰۲۰:
```sql
SELECT SUM(total)
FROM orders
WHERE created_at BETWEEN '2020-01-01 00:00:00' AND '2020-12-31 23:59:59'
AND user_id = 345
```
**نکته:** تعداد کاربران بسیار بیشتر از حداکثر تعداد سفارشهای یک کاربر است.
3. مجموع مبلغ سفارشها به ازای هر روز، بهترتیب صعودی تاریخ؛ نتیجه بهترتیب شامل ستون تاریخ و ستون مجموع مبلغ سفارشها باشد. تاریخ باید به فرمت `Y-m-d` باشد. همچنین، **تاریخهایی بین تاریخهای موجود در جدول که در آنها سفارشی ثبت نشده است نیز باید در نتیجه موجود باشند**. نام ستونهای خروجی اهمیت ندارد.
**نکته:** هر کوئری نمرهای جداگانه دارد و اگر کوئری یک قسمت را نتوانستید بزنید، کوئریهایی که حل کردید را بفرستید و قسمت آن کوئری را خالی بگذارید.
# آنچه باید آپلود کنید
پس از طراحی کوئریها، کد خود را در قالب زیر در یک فایل با پسوند `.sql` آپلود کنید.
```sql
-- Section1
Your first query here
-- Section2
Your second query here
-- Section3
Your third query here
```
**کوئریهای شما باید روی _MySQL_ قابل اجرا باشند.**
---
علی فرد جوانی است که چندین سال است که در محلهای در یکی از شهرها سوپرمارکتی را میگرداند. او قصد دارد که در حرکتی جدید چندین شعبه برای خود ایجاد کند و محصولات خود را بهصورت اینترنتی بهفروش برساند. در اولین قدم، او تصمیم گرفته است تا دیتابیس فروشگاه آنلاین خود را طراحی کند. او اینکار را کرده و بهصورت تصویر زیر دادهها را نگهداری میکند:
![db](https://quera.ir/qbox/view/qDnGMwpFVZ/db.png)
اما همانطور که مشخص است، طراحی این دیتابیس اصلاً جالب نیست و افزونگی داده دارد.
در این سؤال، شما باید این دیتابیس را برای علی نرمالسازی کنید.
# جزئیات پروژه
اطلاعات جدول موجود بهصورت زیر است:
|نام ستون|نوع|تعریف|
|:-------|:--|----:|
|`m_id`|`bigint AUTO_INCREMENT`|آیدی شعبه|
|`m_name`|`varchar(255)`|نام شعبه|
|`m_address`|`text`|آدرس شعبه|
|`p_id`|`bigint AUTO_INCREMENT`|آیدی محصول|
|`p_name`|`varchar(255)`|نام محصول|
|`p_weight`|`bigint`|وزن محصول|
|`price`|`bigint`|قیمت محصول|
|`level`|`int`|سطح شعبه|
|`m_score`|`bigint`|امتیاز شعبه|
|`capacity`|`bigint`|ظرفیت تعداد محصول مربوط به سطح شعبه|
همچنین توجه کنید که در جدول بالا `m_id` و `p_id` کلید هستند.
# مطلوبات
تنها خواسته از شما در این سوال این است که جدول شکلی که در ابتدای سؤال آمده است را پس از نرمالسازی، **فقط با استفاده از دستورات `DDL`** ایجاد و ارسال کنید.
شما باید نرمالسازی را تا جایی ادامه دهید که هیچکدام از وابستگیها (*dependencies*) نقض نشوند.
تنها نکتهی مهم این سؤال، نامگذاری جداول است. باید طبق جدول زیر از نام هر یک از جداول که احتیاج دارید، استفاده کنید.
|کلید|نام جدول|
|:----:|:----:|
|شعبهها|markets|
|امتیازات|scores|
|محصولات|products|
|نامها|names|
|وزنها|weights|
|آدرسها|addresses|
|قیمتها|prices|
|ظرفیتها|capacities|
# نکات
+ **دقتکنید** که نیاز به استفاده از همهی جداول ذکر شده در جدول بالا نیست و فقط باید از جداولی که به آنها احتیاج دارید استفاده کنید.
+ تمام اطلاعات ستونها (مانند نام و...) باید مشابه موارد ذکر شده در اول سؤال باشند و نباید تغییر کنند.
+ امکان `NULL` بودن در هیچ یک از ستونها مجاز نیست.
+ کلیدهای خارجی باید به درستی ایجاد شوند (نام آنها اهمیتی ندارد).
# آنچه باید آپلود کنید
پس از طراحی کوئریها، کد خود را در قالب یک فایل با پسوند `.sql` آپلود کنید.