رفتن به مطلب

کوئری بدست آوردن مقادیر تکراری و نمایش اطلاعات کاربر


fun_code

ارسال‌های توصیه شده

سلام و عرض ادب

در یکی از اپ هام ، زمان ثبت نام کد معرف میگیرم.

بعد اگر کد معرف صحیح باشه ID معرف کننده رو در یک فیلد مربوط به کاربر معرفی شده قرار میدم که بدونم این کاربر توسط فلان ID معرفی شده...

الان میخوام با PHP لیست معرفی کننده ها رو بر اساس بیشترین معرفی نمایش بدم و هر 5 معرفی یک امتیاز در جدول محاسبه کنه.

مشکل اینه که نمیدونم چطور نام معرفی کننده رو از فیلد moaref_id بدست بیارم و اینکه وقتی بر 5 تقسیم میشه مقدار اعشاری میده و اینکه وقتی به فیلد COUNT(moaref_id)/5 نام مشخصی اتصال میدم خطا میده (در sqlserver خطا نمیگیره)

SELECT moaref_id,COUNT(moaref_id)/5 FROM `users` where moaref_id is not null 
GROUP BY moaref_id 
HAVING COUNT(moaref_id) >= 5

فرض کنید علی 5 نفر رو معرفی کرده

محمد 17 نفر رو و الی آخر

خروجی که از کوئری میگیرم رو در جدول نمایش میدم. البته میدونم میشه با حلقه و کدهای بیشتر نام moaref_id ها رو بدست آورد... اما گفتن شاید بشه با همین کوئری ها با سرعت بالا اینکار رو کرد.

باید چنین باشه...

نام                  تعداد معرفی

علی                       1

محمد                    3

لینک ارسال
به اشتراک گذاری در سایت های دیگر

سلام

قرار نیست هر عددی بر 5 تقسیم بشه پس شما میتونید حاصل رو بگیرید و اعشارشو حذف کنید

مثلا جمع معرفین علی میشه 21 تقسیم 5 میشه 4.2 شما بیا اعشارشو حذف کن و 4 نشون بده

 

واسه ترتیبشون هم میتونی از سورت استفاده کنی مثلا این کوئری

SELECT * FROM `users` ORDER BY moaref_id

میاد براساس اعداد رکوردهای ستون امتیازات رو لیست میکنه و برمیگردونه

البته نوع فیلدی که واسه تعداد امتیازات درنظر گرفتید باید از نوع int باشه توی دیتابیس که این عمل کنه

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۱۱/۸ در 18:36، For گفته است:

سلام

قرار نیست هر عددی بر 5 تقسیم بشه پس شما میتونید حاصل رو بگیرید و اعشارشو حذف کنید

مثلا جمع معرفین علی میشه 21 تقسیم 5 میشه 4.2 شما بیا اعشارشو حذف کن و 4 نشون بده

 

واسه ترتیبشون هم میتونی از سورت استفاده کنی مثلا این کوئری

SELECT * FROM `users` ORDER BY moaref_id

میاد براساس اعداد رکوردهای ستون امتیازات رو لیست میکنه و برمیگردونه

البته نوع فیلدی که واسه تعداد امتیازات درنظر گرفتید باید از نوع int باشه توی دیتابیس که این عمل کنه

سلام

ممنون اما احتمالا متوجه عرض بنده نشدید.

ما بر اساس فیلد moaref_id میتونیم متوجه بشیم مثلا علی 5 تا رو معرفی کرده و کدی که در بالا نوشتم میاد مشخص میکنه مثلا فلان ID ده بار تکرار شده یعنی همون 10 تارو معرفی کرده.

در همون کوئری میخوام نام اونی که 10 بار آیدیش تکرار شده رو در بیارم. همچنین فیلدی که تعداد امتیازات رو مشخص میکنه در جدول نداریم و خود کوئری اون فیلد رو ایجاد میکنه صرفا جهت نمایش دادن.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۱۱/۸ در ۱۷:۵۴، fun_code گفته است:

سلام و عرض ادب

در یکی از اپ هام ، زمان ثبت نام کد معرف میگیرم.

بعد اگر کد معرف صحیح باشه ID معرف کننده رو در یک فیلد مربوط به کاربر معرفی شده قرار میدم که بدونم این کاربر توسط فلان ID معرفی شده...

الان میخوام با PHP لیست معرفی کننده ها رو بر اساس بیشترین معرفی نمایش بدم و هر 5 معرفی یک امتیاز در جدول محاسبه کنه.

مشکل اینه که نمیدونم چطور نام معرفی کننده رو از فیلد moaref_id بدست بیارم و اینکه وقتی بر 5 تقسیم میشه مقدار اعشاری میده و اینکه وقتی به فیلد COUNT(moaref_id)/5 نام مشخصی اتصال میدم خطا میده (در sqlserver خطا نمیگیره)

SELECT moaref_id,COUNT(moaref_id)/5 FROM `users` where moaref_id is not null 
GROUP BY moaref_id 
HAVING COUNT(moaref_id) >= 5

فرض کنید علی 5 نفر رو معرفی کرده

محمد 17 نفر رو و الی آخر

خروجی که از کوئری میگیرم رو در جدول نمایش میدم. البته میدونم میشه با حلقه و کدهای بیشتر نام moaref_id ها رو بدست آورد... اما گفتن شاید بشه با همین کوئری ها با سرعت بالا اینکار رو کرد.

باید چنین باشه...

نام                  تعداد معرفی

علی                       1

محمد                    3

سلام. کسانی که بیشتر از  5 معرفی دارند رو بترتیب تعداد معرفی بگیرید (که با group/ count ساده میشه گرفت و گرفتید)

تقسیم و تابع فلور رو سمت php یا sql میتونید انجام بدین. فرقی نداره اینجا

sql
SELECT FLOOR(28/5) AS FloorValue;

php
echo floor(12/7);  

تابع فلور اینجا میخواید که هردو زبون داره ولی این دو تابع هم برای تبدیله ممکنه بعدا به دردتون بخوره (بتیدل به دسیمال با تعداد ارقام خاص  ..)

https://mariadb.com/kb/en/convert/

https://www.w3schools.com/sql/func_sqlserver_cast.asp

لینک ارسال
به اشتراک گذاری در سایت های دیگر

نام ها اگه در جدول دیگه ای هست. از کوئری تو در تو یا جوین کردن دو کوئری شاید باید استفاده کنید (جوین کردن فکر میکنم اینجا)

https://www.w3schools.com/sql/sql_join.asp

https://www.w3schools.com/sql/sql_in.asp

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۱۱/۹ در ۱۶:۴۲، rasool.g گفته است:

نام ها اگه در جدول دیگه ای هست. از کوئری تو در تو یا جوین کردن دو کوئری شاید باید استفاده کنید (جوین کردن فکر میکنم اینجا)

https://www.w3schools.com/sql/sql_join.asp

https://www.w3schools.com/sql/sql_in.asp

 

سلام دوست عزیز

ممنونم

ناچارا با دو تا کوئری مجزا نوشتمش. هرکاری کردم نتونستم در یک کوئری بنویسمش.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۱۱/۹ در ۱۹:۱۰، fun_code گفته است:

سلام دوست عزیز

ممنونم

ناچارا با دو تا کوئری مجزا نوشتمش. هرکاری کردم نتونستم در یک کوئری بنویسمش.

خواهش میکنم. اگر جدول یا جدول ها هم میبود بهتر میتونستم نظر بدم🙏

دو کوئری، چه تودرتو.چه جوین کردن هم. اگر از ایندکس استفاده کنید (اید هارو اندکس کنید مثلا) سرعت بالایی داره و مسئله یا مشکلی نیست بازم از نظر کارایی و سرعت و .. 👌

خود من گاهی ممکنه کوئری های طولانی یا پیچیده رو هم اگر ببینم از نظر کارایی یا سرعت فرقی نمیکنه چند تیکه کنم یا یکسری کار ها رو برا ساده تر شدن سمت دیگه b4a php  .. انجام بدم و ..👍

و برای تست کارایی و سرعت تایمر میزارم فقط

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۱۱/۹ در 20:21، rasool.g گفته است:

خواهش میکنم. اگر جدول یا جدول ها هم میبود بهتر میتونستم نظر بدم🙏

دو کوئری، چه تودرتو.چه جوین کردن هم. اگر از ایندکس استفاده کنید (اید هارو اندکس کنید مثلا) سرعت بالایی داره و مسئله یا مشکلی نیست بازم از نظر کارایی و سرعت و .. 👌

خود من گاهی ممکنه کوئری های طولانی یا پیچیده رو هم اگر ببینم از نظر کارایی یا سرعت فرقی نمیکنه چند تیکه کنم یا یکسری کار ها رو برا ساده تر شدن سمت دیگه b4a php  .. انجام بدم و ..👍

و برای تست کارایی و سرعت تایمر میزارم فقط

سلام

ممنون رسول جان بابت راهنماییت 🙏

الان کوئری زیر میاد دقیقا برترین معرف ها رو مشخص میکنه.

 

$db1 = Query("SELECT moaref_id,COUNT(moaref_id) as 'rpt' FROM users where moaref_id is not null GROUP BY moaref_id HAVING COUNT(moaref_id) >= 1 order by rpt desc");

فقط مشکل اینجاست نمیدونم چطور قانون خودمون رو در این کوئری اعمال کنم.

قرار این بوده ثبت نام هایی رو در نظر بگیریم که در دستگاه های متفاوت انجام شده...(نه در یک دستگاه تکراری)

یه فیلد android_id داریم که شناسه توکن دستگاه کاربر در اون ثبت میشه...

اول باید select کنیم و سطرهایی که android_id اونها تکراریه حذف بشه و از باقیمانده دیتاها کوئری بالا بیاد برترین معرف ها رو مشخص کنه.

مثلا کاربری در دستگاه خودش 3 اکانت دیگه در دستگاه خودش ساخته و کد معرف خودش رو زده... قاعدتا این 3 اکانت رو اصلا نباید در نظر بگیریم و تنها اکانت هایی که در دستگاه های تکراری نیست باید محاسبه بشن.

تو این مورد موندم/

نمیدونم دستور distinct رو چطور در کوئری بالا بکار ببرم که درست کار کنه !

از select تودرتو هم استفاده کردم نشد.

ممنون

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۱۱/۱۱ در 11:47، fun_code گفته است:

سلام

ممنون رسول جان بابت راهنماییت 🙏

الان کوئری زیر میاد دقیقا برترین معرف ها رو مشخص میکنه.

 

$db1 = Query("SELECT moaref_id,COUNT(moaref_id) as 'rpt' FROM users where moaref_id is not null GROUP BY moaref_id HAVING COUNT(moaref_id) >= 1 order by rpt desc");

فقط مشکل اینجاست نمیدونم چطور قانون خودمون رو در این کوئری اعمال کنم.

قرار این بوده ثبت نام هایی رو در نظر بگیریم که در دستگاه های متفاوت انجام شده...(نه در یک دستگاه تکراری)

یه فیلد android_id داریم که شناسه توکن دستگاه کاربر در اون ثبت میشه...

اول باید select کنیم و سطرهایی که android_id اونها تکراریه حذف بشه و از باقیمانده دیتاها کوئری بالا بیاد برترین معرف ها رو مشخص کنه.

مثلا کاربری در دستگاه خودش 3 اکانت دیگه در دستگاه خودش ساخته و کد معرف خودش رو زده... قاعدتا این 3 اکانت رو اصلا نباید در نظر بگیریم و تنها اکانت هایی که در دستگاه های تکراری نیست باید محاسبه بشن.

تو این مورد موندم/

نمیدونم دستور distinct رو چطور در کوئری بالا بکار ببرم که درست کار کنه !

از select تودرتو هم استفاده کردم نشد.

ممنون

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۱۱/۱۱ در 11:47، fun_code گفته است:

سلام

ممنون رسول جان بابت راهنماییت 🙏

الان کوئری زیر میاد دقیقا برترین معرف ها رو مشخص میکنه.

 

$db1 = Query("SELECT moaref_id,COUNT(moaref_id) as 'rpt' FROM users where moaref_id is not null GROUP BY moaref_id HAVING COUNT(moaref_id) >= 1 order by rpt desc");

فقط مشکل اینجاست نمیدونم چطور قانون خودمون رو در این کوئری اعمال کنم.

قرار این بوده ثبت نام هایی رو در نظر بگیریم که در دستگاه های متفاوت انجام شده...(نه در یک دستگاه تکراری)

یه فیلد android_id داریم که شناسه توکن دستگاه کاربر در اون ثبت میشه...

اول باید select کنیم و سطرهایی که android_id اونها تکراریه حذف بشه و از باقیمانده دیتاها کوئری بالا بیاد برترین معرف ها رو مشخص کنه.

مثلا کاربری در دستگاه خودش 3 اکانت دیگه در دستگاه خودش ساخته و کد معرف خودش رو زده... قاعدتا این 3 اکانت رو اصلا نباید در نظر بگیریم و تنها اکانت هایی که در دستگاه های تکراری نیست باید محاسبه بشن.

تو این مورد موندم/

نمیدونم دستور distinct رو چطور در کوئری بالا بکار ببرم که درست کار کنه !

از select تودرتو هم استفاده کردم نشد.

ممنون

خواهش. تنها روش رسیدن به کوئری مناسب همون تست حالت های مختلفه

یه GROUP BY دوتایی به ذهنم رسید ولی یادم نیست چجوری بود و هست منم 👌

اگه تایمر و تست زمان زیاد نشون نمیده همون 3 کوئری یا بیشترم خوبه 👌 (خود چند کوئری هم البته اگه تو در تو باشه و یکجا در یک sql اجرا بشه سریع تره (و ساده تر فکر کنم اکثر مواقع) تا جدا )

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...