گرفتن رکوردهایی با مقادیر یکسان در یک فیلد

DaDaDooDoo

کاربر VIP
سلام
من دنبال یه راه حل بهینه و منطقی می گردم واسه موضوع زیر :

یک سری رکورد داریم توی دیتابیس که یه فیلد دارن به اسم مثلا a توی این فیلد a یه مقداری هست که ممکنه توی چند تا رکورد این مقدار مشابه باشه مثلا ۵ تا رکور داریم که مقدار فیلد a اون ها همگی 885544 هست و ۱۰ تا رکورد دیگه داریم که مقدار a در اونها 2000 هست
حالا من می خوام رکوردهایی که مقدار مشبه دارن رو توی UI مشخص کنم. مثلا توی جدول اون هایی که مقدار 885544 دارن سبز بشه و مثالا اونهایی که 2000 دارن قرمز
اما چند تا مشکل هست :
۱ - این رکوردها \شت سر هم نیستن و ممکنه یکیش اولین رکورد از db باشه یکیش 500
۲ - چون تعداد رکورد ها خیلی بالاس از paging استفاده شده با offset 10 یعنی توی هر کوءری فقط 10 تا رکورد بر می گردونه و ممکنه یکی از این رکورد ها با مقدار مشابه توی این 10 تا باشه اما بقیه نباشن
۳ - اگه بخوام array رو sort کنم که این رکورد ها پشت سر هم بیفتن بازم نمی شه چون نحوه نمایش باید بر اساس تاریخ باشه ( والته بازم مشکل بالا هست )

کسی ایده ای واسه انجام این کار داره ؟
 

rahnema1

New Member
سلام
من دنبال یه راه حل بهینه و منطقی می گردم واسه موضوع زیر :

یک سری رکورد داریم توی دیتابیس که یه فیلد دارن به اسم مثلا a توی این فیلد a یه مقداری هست که ممکنه توی چند تا رکورد این مقدار مشابه باشه مثلا ۵ تا رکور داریم که مقدار فیلد a اون ها همگی 885544 هست و ۱۰ تا رکورد دیگه داریم که مقدار a در اونها 2000 هست
حالا من می خوام رکوردهایی که مقدار مشبه دارن رو توی UI مشخص کنم. مثلا توی جدول اون هایی که مقدار 885544 دارن سبز بشه و مثالا اونهایی که 2000 دارن قرمز
اما چند تا مشکل هست :
۱ - این رکوردها \شت سر هم نیستن و ممکنه یکیش اولین رکورد از db باشه یکیش 500
۲ - چون تعداد رکورد ها خیلی بالاس از paging استفاده شده با offset 10 یعنی توی هر کوءری فقط 10 تا رکورد بر می گردونه و ممکنه یکی از این رکورد ها با مقدار مشابه توی این 10 تا باشه اما بقیه نباشن
۳ - اگه بخوام array رو sort کنم که این رکورد ها پشت سر هم بیفتن بازم نمی شه چون نحوه نمایش باید بر اساس تاریخ باشه ( والته بازم مشکل بالا هست )

کسی ایده ای واسه انجام این کار داره ؟

می تونید به اصطلاح یک lookup table درست کنید ورنگها رو به اون اختصاص بدید و از روی اون نتایج کوری را رنگ کنید
ساخت lookup table:
SELECT distinct a FROM mytable
اگر جدول اصلی مرتب آپدیت میشه میتونید یک تریگر بگذارید که در صورتی که مقداری که در جدول اصلی وارد شده در lookup وجود ندارد آن رکورد را به lookup اضافه کند
 

DaDaDooDoo

کاربر VIP
آهان یعنی از یه table جدید توی db بسازم که distinct جدول اصلی رو توی اون نگه دارم ؟ اونوقت برای هر با واکشی اطلاعات باید به ۲ تا table کوءری بزنم
خوب به جای این کار می شه هر بار که کوءری می زنم یه distinct هم بگیرم به جای این کار و دیگه table جدید نسازم ولی روش شما با اینکه از روش خودم بهینه تره اما به نظرم بازم بهینه نیست چون تعداد رکورد ها وحشتناک بالاست و در هر ثانیه آپیدت میشه یعنی در هر ثانیه ۳ الی ۵ تا رکورد جدید اضافه می شه و به ازای هر کدوم اگه یه تریگر اجرا بشه بار ستگینی میاد روی db
 

rahnema1

New Member
اگر براتون مهم نیست که دو تا رکورد که مقدار یکسانی دارند و در دو تا پیج متفاوت هستند رنگ یکسانی داشته باشند و فقط هدف شما این باشد که دوتا رکورد یکسان که در یک پیج باشند همرنگ باشند می توانید این شبه کد را به کار ببرید با فرض اینکه نتایج کوری در ده رکورد به شما برگردانده شود. ابتدا یک لیست شامل ده تا رنگ را ایجاد کنید به نام colors بعدا بیایید فیلد a را sort کنید ( از سورتی استفاده کنید که اندکس آیتم های sort شده را برگرداند)
colors={color1,color2,color3,...,color10 }
sorted_index=sort(table.a,index)
colors_index=1
table.record[sorted_index[1]].color=colors[1]
for i from 2 to 10
if table.record[sorted_index].a != table.record[sorted_index[i-1]].a then colors_index=colors_index+1
table.record.color=colors[colors_index



 

DaDaDooDoo

کاربر VIP
خوب دو تا نکته
نکته اول اینکه اگه ممکنه کد هاتون رو توی تگ
PHP:
 قرار بدید که خوانا بشه
نکته دوم اینکه اصلا رنگ و رنگ کردن برای من مهم نیست مهم تشخیص این هست که چند تا رکورد اون کد مشابه رو دارن
ممنون
 

rahnema1

New Member
خوب دو تا نکته
نکته اول اینکه اگه ممکنه کد هاتون رو توی تگ
PHP:
 قرار بدید که خوانا بشه
نکته دوم اینکه اصلا رنگ و رنگ کردن برای من مهم نیست مهم تشخیص این هست که چند تا رکورد اون کد مشابه رو دارن
ممنون[/QUOTE]

دوست عزیز اگه همون اول می گفتید تعداد رو می خواهید کار ما رو راحت تر می کردید
SELECT a, count() FROM mytable group by a
 

DaDaDooDoo

کاربر VIP
با group by هم نمی شه چون فقط ۱۰ تا از رکورها توی هر کوءری واکشی می شه
 

rahnema1

New Member
با group by هم نمی شه چون فقط ۱۰ تا از رکورها توی هر کوءری واکشی می شه

خب group by تعداد کمتری رکورد بر می گردونه مثل همون کاری که distinct می کنه مثلا اگر با کوئری بدون group by شما 1000 تا رکورد داشته باشید با group by مثلا ممکنه 100 تا رکورد برگردونه وبعد هم می تونید وقتی پیج اول رو دیدید به پیج دیگه یا ده تای بعدی بروید توی ui هم پایین جدول یک آیکن ممکنه باشه یا اگه نباشه می تونید بذارید تا شما رو به پیج بعدی منتقل کنه

نکته دیگه اینکه وقتی شما group by می زنید پردازش روی تمام رکوردهای db انجام میشه نه روی 10 تا و اون 10 تایی که برای شما نشان داده می شه ده تا اول نتایج بدست آمده از اون پردازش است
 

DaDaDooDoo

کاربر VIP
نکته دیگه اینکه وقتی شما group by می زنید پردازش روی تمام رکوردهای db انجام میشه نه روی 10 تا و اون 10 تایی که برای شما نشان داده می شه ده تا اول نتایج بدست آمده از اون پردازش است

در مورد group by و distinct می دونم اما نمی دونستم رو کل رکوردها اعمال می شه , یعنی وقتی limit و offset هم بزاری بازم روی کل رکوردها اعمال می شه ؟ مطمءنی ؟
 

rahnema1

New Member
بله ! اگه توی راهنمای mysql نگاه کنی در تعریف limit نوشته
The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement
یعنی تعداد سطرهایی که بر می گردونه نه سطرهایی که پردازش می کنه
 

جدیدترین ارسال ها

بالا