برگزیده های پرشین تولز

این روش query گرفتن رو کی بلده !

shayanblue

کاربر تازه وارد
تاریخ عضویت
18 مارس 2005
نوشته‌ها
14
لایک‌ها
6
سن
40
محل سکونت
localhost
سلام دوستان کسی میتونه به من کمک کنه که چطور از یک table در دیتابیس mysql رکورد بگیرم طوری که اولویت با مواردی باشه که بیشتر تکرار شده باشن ممنون میشم راهنمایی کنین.
 

shayanblue

کاربر تازه وارد
تاریخ عضویت
18 مارس 2005
نوشته‌ها
14
لایک‌ها
6
سن
40
محل سکونت
localhost
دوستان کسی نمی تونه یه سر نخ به من بده ! قبلآ خیلی زود تر به موضوع های مطرح شده جواب داده میشد مدیر این قسمت از انجمن یا هر کدوم از اساتید جواب سوال من رو بدن ممنون میشم.
 

Parsa_361

کاربر فعال صفحات داینامیک
کاربر فعال
تاریخ عضویت
5 آگوست 2005
نوشته‌ها
889
لایک‌ها
10
محل سکونت
Isfahan, php.ini
:D
فکر کنم بهترین راه این باشه ! :

اول تمام رکورد ها رو به صورت نا مرتب بگیر و توی یه آرایه بریز !
و بعد به وسیله ی PHP راحت میشه مرتب کرد !
 

shayanblue

کاربر تازه وارد
تاریخ عضویت
18 مارس 2005
نوشته‌ها
14
لایک‌ها
6
سن
40
محل سکونت
localhost
پارسا جان چیزی که شما به اون اشاره کردین به ذهن خودمم رسید ولی باسه رکورد های با تعداد بالا فکر نکنم راه حل مناسبی باشه برای همین رفتم سراغ دستورات sql ولی تا الان به نتیجه ی نرسیدم!
 

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
من با MSSQL میتونم راهنماییت کنم ولی MySQL ندارم که تست کنم!
 

Parsa_361

کاربر فعال صفحات داینامیک
کاربر فعال
تاریخ عضویت
5 آگوست 2005
نوشته‌ها
889
لایک‌ها
10
محل سکونت
Isfahan, php.ini
به نقل از shayanblue :
پارسا جان چیزی که شما به اون اشاره کردین به ذهن خودمم رسید ولی باسه رکورد های با تعداد بالا فکر نکنم راه حل مناسبی باشه برای همین رفتم سراغ دستورات sql ولی تا الان به نتیجه ی نرسیدم!
:blink: :blink:
این جوری که بهتره !! :blink:
مگه نمی خوای رکورد ها رو به ترتیب خاصی ار db بگیری ؟
پس بالاخره باید تمام رکورد ها رو بگیری !!!
اگه بخوای که با یک تریب خاص هم بگیری که دیگه خیلی سرعت کار رو میاره پایین !
پس بهتره کار مرتب کردن رو بزاری به عهده ی PHP !
چون PHP هم قدرت بالاتری داره و هم سرعت خیلی بالا تر !!!!
هر چقدر هم که تعداد رکورد ها زیاد باشه فکر نکنم PHP کم بیاره ! :D
حالا مگه تعداد رکورد هات چقده ؟ :D
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
به نقل از mazoolagh :
من با MSSQL میتونم راهنماییت کنم ولی MySQL ندارم که تست کنم!
فکر نکنم تفاوتی بکنه ها؟ :)
 

setareh2

Registered User
تاریخ عضویت
24 ژانویه 2005
نوشته‌ها
649
لایک‌ها
2
سن
45
محل سکونت
OC
به نقل از shayanblue :
سلام دوستان کسی میتونه به من کمک کنه که چطور از یک table در دیتابیس mysql رکورد بگیرم طوری که اولویت با مواردی باشه که بیشتر تکرار شده باشن ممنون میشم راهنمایی کنین.
بهترین حالت اینه که یه تیبل دیگه درست کنی موقع ورود اطلاعات تو تیبل 1 به صورت کانتر تیبل 1 عمل کنه.(از 2 فیلد آی دی و کانتر تشکیل شده باشه)
اینجوری هم استانداردتره هم موقع فراخونی ریسورس کمتری میگیره.
 

setareh2

Registered User
تاریخ عضویت
24 ژانویه 2005
نوشته‌ها
649
لایک‌ها
2
سن
45
محل سکونت
OC
به نقل از Parsa_361 :
:blink: :blink:
این جوری که بهتره !! :blink:
مگه نمی خوای رکورد ها رو به ترتیب خاصی ار db بگیری ؟
پس بالاخره باید تمام رکورد ها رو بگیری !!!
اگه بخوای که با یک تریب خاص هم بگیری که دیگه خیلی سرعت کار رو میاره پایین !
پس بهتره کار مرتب کردن رو بزاری به عهده ی PHP !
چون PHP هم قدرت بالاتری داره و هم سرعت خیلی بالا تر !!!!
هر چقدر هم که تعداد رکورد ها زیاد باشه فکر نکنم PHP کم بیاره ! :D
حالا مگه تعداد رکورد هات چقده ؟ :D
بسته به ترافیک + رم + سی پی یو + تعداد رکورد داره
اگه تعداد رکورد + ترافیک زیاد باشه اصلا کار منطقی نیست...
 

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
شاید من سئوال رو درست نفهمیدم ولی چرا شما میگین که باید یک جدول دیگه درست بشه. پس این domain aggregateها به چه دردی میخورن؟

نمیدونم syntax پایین توی MySQL هم درست هست یا نه ولی توی MSSQL درسته!

کد:
select count(fld1) , fld1, fld2,... 
from table_name
where ....
group by fld1
order by count(fld1) desc
 

sama_sally

Registered User
تاریخ عضویت
5 آپریل 2005
نوشته‌ها
2,598
لایک‌ها
1
سن
35
محل سکونت
Essen, Deutschland
آره درسته
ببین مگه نمیخوای با ترتیب باشه؟
خوب توی query مشخصه order by رو بزن
!
 

setareh2

Registered User
تاریخ عضویت
24 ژانویه 2005
نوشته‌ها
649
لایک‌ها
2
سن
45
محل سکونت
OC
من رو حرف مازولاق حرف نمیزنم!!;)
ولی شکل mysql کدتون این میشه:
کد:
select field_name, count(*) AS number
from table_name
GROUP BY field_name
ORDER BY number;
البته به نظر من اگه تعدا فیلدها خیلی زیاد باشه و همینطور تعداد کانکشن ها بالا باشه این کوئری چیز جالبی نیست.
اگه یه تیبل دیگه بسازیم کوئری فقط یه sort انجام میده و هم خیلی سریعتره و هم ریسورس کمی استفاده میکنه
اما با این کوئری هر کدوم علاوه بر sort برای تک تک فیلدهای یه فانکشن count هم انجام میده... اگه اینو تو یه دیتابیس بزرگ امتحان کنید میتونید اختلافش رو تو زمان اجرای کوئری ببینید.
 

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
اینی که مازولاق گذاشت رو من توی اکسس تست کردم. اگر یک فیلد بخوایم کاملا درسته ولی اگر دوتا فیلد بخواید درست در نمیاد...​
کد:
select count(fld1) , fld1 
from table_name
group by fld1
order by count(fld1) desc
کار می کنه ولی:

کد:
select count(fld1) , fld1, fld2 
from table_name
group by fld1
order by count(fld1) desc
کار نمیکنه.
 

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
حق با بلابلا هست - نباید هم برای بیشتر از یک فیلد کار کنه! حالا هر نوع سرور SQL که میخواد باشه . بنابراین با این روش یعنی استفاده از توابع domain aggregate نمیشه این مسئله رو حل کرد (حداقل بصورت مستقیم)
 

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
به نقل از setareh2 :
من رو حرف مازولاق حرف نمیزنم!!;)
ولی شکل mysql کدتون این میشه:
کد:
select field_name, count(*) AS number
from table_name
GROUP BY field_name
ORDER BY number;
البته به نظر من اگه تعدا فیلدها خیلی زیاد باشه و همینطور تعداد کانکشن ها بالا باشه این کوئری چیز جالبی نیست.
اگه یه تیبل دیگه بسازیم کوئری فقط یه sort انجام میده و هم خیلی سریعتره و هم ریسورس کمی استفاده میکنه
اما با این کوئری هر کدوم علاوه بر sort برای تک تک فیلدهای یه فانکشن count هم انجام میده... اگه اینو تو یه دیتابیس بزرگ امتحان کنید میتونید اختلافش رو تو زمان اجرای کوئری ببینید.

یعنی حتما باید یک تیبل دیگه بسازیم دیگه!
 

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
ارزش فکر کردن رو داره!
کلی تکنیکها و روشهای پیچیده هست که اکثر ما از اونها بیخبریم. ممکنه این مساله با یکی از این روشها بسادگی حل بشه.
 

shayanblue

کاربر تازه وارد
تاریخ عضویت
18 مارس 2005
نوشته‌ها
14
لایک‌ها
6
سن
40
محل سکونت
localhost
دوستان عزیز شاید شما متوجه چیزی که من گفتم نشدید ، شایدم من نتونستم منظورم رو خوب بیان کنم. با یه مثال چیزی که تو ذهنم هست رو خدمتتون توضیح میدم.

در نظر بگیرین ما دو تا Table بصورت زیر داریم :

PHP:
picture:



Columns:   | picture_id | picture_name |
_______________________________________
Rows(1):   |      1     | photo_one    |
Rows(2):   |	  2     | photo_two    |
Rows(3):   |      3     | photo_three  |
_______________________________________



picture_counter:



Columns:   | picture_id |    date    |
_____________________________________
Rows(1):   |      1     | 2005/12/03 |
Rows(2):   |	  2     | 2005/12/03 |
Rows(3):   |      3     | 2005/12/03 |
Rows(4):   |      1     | 2005/12/03 |
Rows(5):   |      1     | 2005/12/02 |
Rows(6):   |      1     | 2005/12/02 |
Rows(7):   |      3     | 2005/12/01 |
Rows(8):   |      2     | 2005/12/01 |
Rows(9):   |      3     | 2005/12/01 |
_____________________________________


بدین ترتیب که اطلاعات مورد نظری که ما می خوایم در picture_counter ذخیره کنیم با هر بار مشاهده شدن تصاویر در این Table بصورت اتوماتیک اضافه میشن پس مقادیر این Table مدام در حال زیاد شدن هستن و ما با سطرهای محدودی روبه رو نیستیم. و مرتب کردن رکوردها بوسیله یک آرایه مجزا راه حل منطقی به نظر نمیاد!


حالا تا این جای کار رو با هم متوجه شدیم بریم سراغ اصل چیزی که مورد نظرمون هست. ما می خوایم رکوردی که از picture_counter می گیریم یه این صورت باشه که اولویت با سطرهایی باشه که picture_id در اونا بیشتر تکرار شده باشن یعنی به این ترتیب :


PHP:
Columns:   | picture_id |
________________________
Rows(1):   |      1     |
Rows(2):   |	  3     |
Rows(3):   |      2     |
________________________

همان طور که مشاهده میکنین picture_id =1 با 4 مرتبه تکرار در سطر اول picture_id =3 با سه مرتبه تکرار در سطر دوم و picture_id =2 با دو مرتبه تکرار در سطر سوم این رکورد گیری قرار میگیرند و اولویت با موارد هست که بیشترین تکرار رو داشتن!

حالا شاید این سوال براتون پیش بیاد که چرا تیبل picture رو به صورت زیر طراحی نکنیم و با هر بار مشاهده تصاویر مقادیر مربوط یه هر تصویر در hit_counter مربوطه update بشه !

PHP:
Columns:   | picture_id | picture_name | hit_counter |
_____________________________________________________
Rows(1):   |      1     | photo_one    |             |
Rows(2):   |	  2     | photo_two    |             |
Rows(3):   |      3     | photo_three  |             |
_____________________________________________________

در جواب باید بگم مضیت چیزی که تو ذهن من هست اینه که این طوری میتونیم بفهمیم تصاویر پر بازدید ( در این مثال ) در هر روز یا کلی تر در هر ماه چه تصاویری هستن! این چیزیه که تو ذهن منه امید وارم منظورم، رو فهمیده باشید.

در رابطه با مسئله ای که دوستان لطف کردن و در رابطه با اون صحبت شد، یه اشاره ی ( گسداخی ) کوتاه میکنم که از بحث اصلی منحرف نشیم.

PHP:
SELECT COUNT(fild_name) AS conter FROM table_name;

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

setareh2

Registered User
تاریخ عضویت
24 ژانویه 2005
نوشته‌ها
649
لایک‌ها
2
سن
45
محل سکونت
OC
یه بار سوال رو با مثال عنوان میکنید
من فکر کنم اون چیزی که ما فکر می کردیم فرق داره با منظور شما
 
بالا