From 305901314f272379c5578330e44865ca3b3d6661 Mon Sep 17 00:00:00 2001 From: TED <135175623+iamtheted@users.noreply.github.com> Date: Sat, 3 Aug 2024 18:51:28 +0330 Subject: [PATCH] fix: added a few queries & notes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit thanks to the community for gathering the queries 💙 --- marzban/fa/examples/mysql-queries.md | 81 ++++++++++++++++++---------- 1 file changed, 52 insertions(+), 29 deletions(-) diff --git a/marzban/fa/examples/mysql-queries.md b/marzban/fa/examples/mysql-queries.md index ccc9008..d04b43b 100644 --- a/marzban/fa/examples/mysql-queries.md +++ b/marzban/fa/examples/mysql-queries.md @@ -2,35 +2,51 @@ title: کوئری‌ های کاربردی SQL --- - # کوئری های کاربردی SQL -به کمک این آموزش، شما می‌توانید از طریق کوئری های کاربردی `SQL` در دیتابیس خود کارهای مختلفی رو انجام بدید که در فضای پنل ممکن نیست. +به کمک این آموزش، شما می‌توانید از طریق کوئری های کاربردی `SQL` در دیتابیس خود کارهای مختلفی را انجام بدید که در فضای پنل ممکن نیست. -به صورت خلاصه کوئری یعنی پرسیدن یک سوال از دیتابیس و خروجی گرفتن، ولی خیلی از کوئری‌ها به جای خروجی دادن، در دیتابیس تغییر ایجاد می‌کنن لذا اصولا به دسته دوم کوئری نمیگن و صرفاً از روی عادت همه رو کوئری خطاب می‌کنیم. +به صورت خلاصه کوئری یعنی پرسیدن یک سوال از دیتابیس و خروجی گرفتن، ولی خیلی از کوئری‌ها به جای خروجی دادن، در دیتابیس تغییر ایجاد می‌کنن لذا اصولا به دسته دوم کوئری نمیگن و صرفاً از روی عادت همه را کوئری خطاب می‌کنیم. ::: warning توجه برای استفاده کردن از کوئری های `SQL` لازم است تا اول `MySQL` را طبق آموزش [راه‌اندازی MySQL](https://gozargah.github.io/marzban/fa/examples/mysql) راه‌اندازی کرده باشید و پنل مدیریت دیتابیس `PhpMyAdmin` را نیز فعال کرده باشید، همچنین `MySQL` در نسخه `v0.3.2` و بالاتر پشتیبانی می‌شود. ::: ::: warning توجه -در خصوص کدهای SQL که به جای خروجی دادن به شما، در دیتابیس تغییر خاصی ایجاد می کنند لازم است تا قبلا از وارد کردن آن ها طبق داکیومنت [بک‌آپ گرفتن](https://gozargah.github.io/marzban/fa/examples/backup) بک‌آپ بگیرید، چونکه ممکن است تغییراتی در دیتابیس ایجاد شود که بازگشت آن ها به قبل امکان پذیر نباشد. +در خصوص کدهای `SQL` که به جای خروجی دادن به شما، در دیتابیس تغییر خاصی ایجاد می کنند لازم است تا قبلا از وارد کردن آن ها طبق داکیومنت [بک‌آپ گرفتن](https://gozargah.github.io/marzban/fa/examples/backup) بک‌آپ بگیرید، چونکه ممکن است تغییراتی در دیتابیس ایجاد شود که بازگشت آن ها به قبل امکان پذیر نباشد. ::: ## نحوه وارد کردن کوئری ابتدا به پنل مدیریت دیتابیس مرزبان که به صورت پیش فرض روی پورت `8010` ران میشه لاگین کنید. در منوی سمت چپ روی `marzban` بزنید بعد بالای صفحه قسمت `SQL` و یک باکس سفید میاد که یک کد پیش فرض نوشته شده، اول آن را پاک می‌کنیم و بعد کوئری را وارد می‌کنیم و در نهایت دکمه `Go` که پایین باکس قرار دارد را می‌زنیم. ## لیست کوئری‌ های کاربردی SQL -- دیدن لیست کاربرانی که تا تاریخ مشخصی زمانشان به اتمام میرسد +- لیست کاربرانی که اشتراک آن‌ها در یک روز تعیین شده تمام می‌شود +```sql +SELECT * FROM users +WHERE expire >= UNIX_TIMESTAMP('2024-06-13 00:00:00') +  AND expire < UNIX_TIMESTAMP('2024-06-14 00:00:00') +  AND status = 'active'; +``` +::: tip نکته +در واقع با این کوئری، ما لیست یوزرهایی که `13` ژوئن اشتراک آن‌ها تمام می‌شود را می‌بینیم، تاریخ اولی ملاک هست. +::: +- لیست کاربرانی که تا تاریخ مشخصی زمانشان به اتمام میرسد ```sql SELECT * FROM users WHERE expire < UNIX_TIMESTAMP('2024-03-10') and status = 'active'; ``` ::: tip نکته -فرضا ۷ مارس هست توی کوئری بالا ۱۰ مارس تعیین شده پس تمام کاربرانی که ۳ روز از زمان آنها باقی مانده را خروجی میدهد. +فرضا `7` مارس هست توی کوئری بالا `10` مارس تعیین شده پس تمام کاربرانی که `3` روز از زمان آنها باقی مانده را خروجی میدهد. ::: -- دیدن لیست کاربرانی که کمتر از 2 گیگابایت از حجم شان باقی مانده +- لیست کاربرانی که کمتر از `2` گیگابایت از حجم شان باقی مانده ```sql SELECT * FROM users WHERE (data_limit - used_traffic) < (2*1024*1024*1024) and status = 'active' and data_limit IS NOT NULL; ``` +- لیست کاربرانی که `90` درصد حجم خود را مصرف کرده‌اند +```sql +SELECT * FROM users +WHERE used_traffic >= 0.9 * data_limit + AND status = 'active' + AND data_limit IS NOT NULL; +``` - لیست حجم‌های زده شده به تفکیک هر ادمین ```sql SELECT admins.username, users.data_limit/1073741824, Count(*) @@ -55,40 +71,40 @@ LEFT JOIN users ON node_user_usages.user_id = users.id LEFT JOIN admins ON users.admin_id = admins.id GROUP BY admins.username, nodes.name; ``` -- دیدن اسم کلاینت کاربران به تعداد +- مشاهده اسم کلاینت کاربران به تعداد ```sql SELECT SUBSTR(sub_last_user_agent ,1,9), COUNT(*) FROM users WHERE status = 'active' GROUP By SUBSTR(sub_last_user_agent ,1,9) ORDER By SUBSTR(sub_last_user_agent ,1,9); ``` -- دیدن کاربران آنلاین و تعداد آن‌ها +- مشاهده کاربران آنلاین و تعداد آن‌ها ```sql SELECT username FROM users WHERE TIMESTAMPDIFF(MINUTE, now(), online_at) = 0; ``` -- دیدن لیست کاربرانی که X روز لینک سابسکریپشن خودشون و آپدیت نزدن +- لیست کاربرانی که `X` روز لینک سابسکریپشن خود را آپدیت نکردند ```sql SELECT username, datediff(now(), sub_updated_at) as LastUpdate FROM users WHERE datediff(now(), sub_updated_at) > 10 AND status = 'active' ORDER BY LastUpdate DESC; ``` ::: tip نکته -در کوئری بالا جای عدد 10 تعداد روز دلخواه را بگذارید. +در کوئری بالا جای عدد `10` تعداد روز دلخواه را بگذارید. ::: -- دیدن لیست کاربرانی که اینباند غیرفعال دارن +- لیست کاربرانی که اینباند غیرفعال دارند ```sql SELECT users.username, proxies.id, exclude_inbounds_association.inbound_tag FROM users INNER JOIN proxies ON proxies.user_id = users.id INNER JOIN exclude_inbounds_association ON exclude_inbounds_association.proxy_id = proxies.id ORDER BY users.username; ``` -- دیدن لیست کاربرانی که پروتکل `Vmess` براشون غیر فعاله +- لیست کاربرانی که پروتکل `Vmess` برای آن‌ها غیر فعال است ```sql SELECT users.username FROM users WHERE users.username not in (SELECT users.username FROM users LEFT JOIN proxies ON proxies.user_id = users.id WHERE proxies.type = 'VMESS'); ``` ::: tip نکته - در خصوص کوئری بالا اگر پروتکل‌های دیگه رو می‌خواین چک کنین فقط اسم پروتکل رو عوض کنین و حتما حروف بزرگ باشد. + در خصوص کوئری بالا اگر قصد دارید پروتکل‌های دیگر را چک کنید فقط اسم پروتکل را عوض کنید و حتما حروف بزرگ باشد. ::: ## اسکریپت های کاربردی SQL @@ -109,27 +125,27 @@ WHERE users.admin_id = '1' and users.status= 'active' UPDATE users SET users.status= 'active' WHERE users.admin_id = '1' and users.status= 'disabled' ``` -- اضافه کردن 1 روز به زمان کاربران همه ادمین‌ها سودو و غیر سودو +- اضافه کردن `1` روز به زمان کاربران همه ادمین‌ها سودو و غیر سودو ```sql UPDATE users SET expire=expire+(86400 * 1) WHERE expire IS NOT NULL ``` -- کم کردن 1 روز از زمان کاربران همه ادمین‌ها سودو و غیر سودو +- کم کردن `1` روز از زمان کاربران همه ادمین‌ها سودو و غیر سودو ```sql UPDATE users SET expire=expire-(86400 * 1) WHERE expire IS NOT NULL ``` -- اضافه کردن 1 روز به زمان کاربران یک ادمین خاص +- اضافه کردن `1` روز به زمان کاربران یک ادمین خاص ```sql UPDATE users SET expire=expire+(86400 * 1) WHERE expire IS NOT NULL and admin_id in (100,200) ``` -- کم کردن 1 روز از زمان کاربران یک ادمین خاص +- کم کردن `1` روز از زمان کاربران یک ادمین خاص ```sql UPDATE users SET expire=expire-(86400 * 1) WHERE expire IS NOT NULL and admin_id in (100,200) ``` -- اضافه کردن 20 درصد از حجم تعیین شده همه کاربران یک ادمین خاص به آن ها +- اضافه کردن `20` درصد از حجم تعیین شده همه کاربران یک ادمین خاص به آن ها ```sql UPDATE users SET data_limit = data_limit + (data_limit * 20) / 100 WHERE data_limit IS NOT NULL and admin_id in (100,200) ``` -- کم کردن 20 درصد از حجم تعیین شده همه کاربران یک ادمین خاص از آن ها +- کم کردن `20` درصد از حجم تعیین شده همه کاربران یک ادمین خاص از آن ها ```sql UPDATE users SET data_limit = data_limit - (data_limit * 20) / 100 WHERE data_limit IS NOT NULL and admin_id in (100,200) ``` @@ -139,14 +155,18 @@ UPDATE users SET data_limit = data_limit - (data_limit * 20) / 100 WHERE data_l ::: tip نکته در خصوص اسکریپت های `SQL` که برای یک ادمین خاص هستند لازم است تا آیدی ادمین در تیبل دیتابیس را وارد کنید بعد کد را ران کنید، در بعضی کدها ممکن است صرفا یوزنیم ادمین لازم باشد پس تفاوت این دو نوع کد را تشخیص دهید. همچنین در بعضی کدها برای مثال دو آیدی در پرانتز با کاما بین آن ها آمده است، اگر یک ادمین دارید صرفا آیدی یک ادمین را بگذارید و اگر بیش از یک ادمین دارید، به تعداد ادمین ها آن ها را با کاما از هم جدا کنید. ::: -- حذف کاربرانی که بیشتر از ۳۰ روز از تاریخ انقضاشون گذشته +- حذف کاربرانی که بیشتر از `30` روز از تاریخ انقضا آن‌ها گذشته ```sql delete from users where datediff(now(),from_unixtime(expire))> 30 ``` ::: tip نکته در خصوص مورد بالا باید تیک `enable foreign key checks` خاموش باشد. ::: -- کاربرهایی که پروتکل `Vless` رو فعال دارن و `Flow` ست نشده باشه براشون ست می‌کنه +- حذف همه کاربرانی که غیرفعال شده‌اند +```sql +delete from users where status = 'disabled' +``` +- کاربرانی که پروتکل `Vless` را فعال دارند اگر `Flow` برای آن‌ها ست نشده باشه برای آن‌ها ست می‌کنه ```sql UPDATE proxies SET settings = JSON_SET(settings, '$.flow', 'xtls-rprx-vision') @@ -185,7 +205,7 @@ WHERE type = 'VMess' and proxies.id in ( ); ``` ::: tip نکته -در خصوص فعال یا غیرفعال کردن پروتکل‌ها برای سایر پروتکل‌ها خودتون می‌تونین جای Vmess قرار بدید و وارد کنید. همچنین جای admin1 یوزنیم ادمین مورد نظر خودتون رو قرار بدید و وارد کنید. +در خصوص فعال یا غیرفعال کردن پروتکل‌ها برای سایر پروتکل‌ها خودتون می‌تونین جای `VMess` قرار بدید و وارد کنید. همچنین جای `admin1` یوزنیم ادمین مورد نظر خود را قرار بدید و وارد کنید. ::: - فعال کردن یک اینباند خاص برای کاربران همه ادمین‌ها سودو و غیر سودو ```sql @@ -222,22 +242,25 @@ FROM users INNER JOIN admins ON users.admin_id = admins.id INNER JOIN proxies Where admins.username = "ADMIN"; ``` ::: tip نکته -در کوئری‌ها بالا که در خصوص فعال و غیرفعال کردن اینباند هست لازمه که جای `INBOUND_NAME` اسم اینباند مورد نظرتون رو بزارین و فقط در کوئری‌های مربوط به یک ادمین خاص یوزنیم ادمین مورد نظرتون رو جای `ADMIN` قرار بدید. +در کوئری‌ها بالا که در خصوص فعال و غیرفعال کردن اینباند هست لازمه که جای `INBOUND_NAME` اسم اینباند مورد نظرتون را بگذارید و فقط در کوئری‌های مربوط به یک ادمین خاص یوزنیم ادمین مورد نظرتون را جای `ADMIN` قرار بدید. +::: +::: warning توجه +در چهار کوئری‌ بالا که برای فعال یا غیرفعال کردن اینباند هست لازمه بدانید اگر به عنوان مثال پروتکل `Vless` برای کاربران فعال نباشد کوئری‌ های بالا برای فعال کردن اینباند تاثیری نخواهند داشت پس اول باید آن پروتکل به خصوص فعال باشد بعد اینباند آن پروتکل دلخواه را فعال یا غیرفعال کنید. ::: ::: warning توجه -در چهار کوئری‌ بالا که برای فعال یا غیرفعال کردن اینباند هست لازمه بدونین اگر به عنوان مثال پروتکل `Vless` برای کاربران فعال نباشد کوئری‌ های بالا برای فعال کردن اینباند تاثیری نخواهند داشت پس اول باید اون پروتکل به خصوص فعال باشد بعد اینباند آن پروتکل دلخواه را فعال یا غیرفعال کنید. +دقت کنید اگر از اسکریپت‌های `SQL` بالا برای فعال کردن پروتکل یا اینباند استفاده ‌می‌کنید، اگر آن اینباند یا پروتکل از قبل حتی برای یک کاربر فعال باشه، تکراری ثبت میشه و باعث میشه `Xray` تمام نودهای شما مکررا ریستارت بشه لذا اگر قصد دارید پروتکل یا اینباند خاصی را برای کاربران فعال کنید، اول برای همه آن را غیرفعال کنید تا اگر از قبل برای کسی فعال بوده غیرفعال شود و سپس برای همه فعال کنید. ::: ## ایونت‌ های کاربردی SQL ایونت‌ها برای سکریپت‌های `SQL` که می‌خوایم در زمان خاصی اجرا بشن کاربرد دارن و فقط برای کوئری‌هایی که در دیتابیس تغییری ایجاد می‌کنن، میشه ایونت قرار داد و برای کوئری‌هایی که خروجی میدن نمیشه این کار را انجام داد. -- کد `SQL` زیر یک `Event` میسازه که هر جمعه ساعت 12 شب جدول `node_user_usages` رو خالی می‌کنه که حجم بکاپ‌تون بالا نره و برای برگردوندن بکاپ با مشکل مواجه نشوید. کسانی که تعداد کاربر بالا دارند می‌توانند این `Event` را برای هر شب تنظیم کنند. +- کد `SQL` زیر یک `Event` میسازه که هر جمعه ساعت `12` شب جدول `node_user_usages` را خالی می‌کنه که حجم بکاپ‌تون بالا نره و برای بازگردانی بکاپ با مشکل مواجه نشوید. کسانی که تعداد کاربر بالا دارند می‌توانند این `Event` را برای هر شب تنظیم کنند. ```sql CREATE EVENT Clear_NodeUserUsages ON SCHEDULE EVERY 1 WEEK STARTS '2024-05-03 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO TRUNCATE node_user_usages ``` -- ایونت روزانه برای ست کردن `Flow` چنانچه فراموش کنید برای کاربر بزارید +- ایونت روزانه برای ست کردن `Flow` چنانچه فراموش کنید برای کاربر بگذارید ```sql CREATE DEFINER=`root`@`%` EVENT `SetFlow` ON SCHEDULE EVERY 1 DAY STARTS '2024-06-01 01:00:00' ON COMPLETION NOT PRESERVE ENABLE DO UPDATE proxies SET settings = JSON_SET(settings, '$.flow', 'xtls-rprx-vision') WHERE type = 'VLESS' AND JSON_UNQUOTE(JSON_EXTRACT(settings, '$.flow')) = ''; ``` @@ -253,7 +276,7 @@ CREATE DEFINER=`root`@`%` EVENT `SetFlow` ON SCHEDULE EVERY 1 DAY STARTS '2024-0 - موقع ویرایش رکورد - موقع حذف رکورد -روی این سه حالت میشه تریگر زد که کار خاصی انجام بشه یا کلا جلوشو گرفت. +روی این سه حالت میشه تریگر زد که کار خاصی انجام بشه یا کلا جلوی آن را گرفت. ::: - تریگر برای جلوگیری از حذف اکانت توسط ادمین‌های خاص @@ -264,5 +287,5 @@ END IF ``` برای غیرفعال کردن تریگر‌ها مثل ایونت‌ها دکمه `Drop` را بزنید غیرفعال می‌شود. ::: tip نکته -دقت کنین داخل پرانتز برای مثال سه تا آیدی ذکر شده ، این بستگی به شما داره که بخواید روی چندتا از ادمین‌هاتون این تریگر رو اعمال کنید، آیدی ادمین مورد نظرتون رو از تیبل‌های دیتابیس پیدا کرده و جایگزین کنید. +دقت کنین داخل پرانتز برای مثال سه تا آیدی ذکر شده ، این بستگی به شما داره که بخواید روی چندتا از ادمین‌هاتون این تریگر را اعمال کنید، آیدی ادمین مورد نظرتون را از تیبل‌های دیتابیس پیدا کرده و جایگزین کنید. :::