parsgreen.com
article

استفاده از ORDER و GROUP در MySQL

mysql-order-group

در ادامه آموزش مقدماتی کار با php و mysql، نوبت به آشنایی با نحوه استفاده از دستورات  ORDER BY و GROUP BY رسیده است، با ذکر این مقدمه که دستورات ذکر شده در واقع با هدف دسته بندی و مرتب سازی دقیق تر نتایج و به دست آوردن مقادیر مورد نظر در هنگام کار با php و mysql ایجاد شده اند، به عبارتی دیگر، در برنامه نویسی کاربردی، مواردی پیش می آید که ناگزیریم اطلاعات را به صورت مرتب شده نشان دهیم، یا نتایج مشابه را در یک مورد خلاصه کنیم، اینجاست که کاربرد ORDER BY و GROUP BY رهگشای ما خواهد بود که در ادامه آموزش به آن خواهیم پرداخت.

دستور ORDER BY


همانطور که در مباحث گذشته از آموزش  مقدماتی MySQL به طور مختصر دیدیم، از ORDER BY در یک دستور SELECT * FROM استفاده می شود، هدف از به کاربردن آن، تفهیم نحوه مرتب سازی و چینش سلیقه ای و سفارشی نتایج و ردیف های درخواست شده از mysql است، به فرض اگر کاربرانی با مقادیر سنی متفاوت در سایت خود داشته باشیم و بخواهیم اسامی آنها را بر اساس سن مرتب کنیم، خواهیم نوشت:
<?php 
mysql_query("SELECT * FROM table WHERE name != '' ORDER BY age");
?>
خروجی کد بالا می تواند به فرض به شکل زیر باشد.
Amin 23
Mohammad 24
Maryam 26
.
.
.
همانطور که ملاحظه می کنید، در مثال بالا از جدول table و دو ستون فرضی name و age استفاده کرده ایم.

استفاده از DESC، ASC و تابع RAND


در حالت پیش فرض، mysql نتایج را به صورت صعودی (از کوچک به بزرگ یا Ascending) مرتب سازی می کند، اما مرتب سازی به صورت نزولی (از بزرگ به کوچک یا Descending) و همچنین مرتب سازی اتفاقی یا رندوم (Random) با افزودن عباراتی که در زیر مشاهده می کنید، امکان پذیر است.
DESC: مرتب سازی پیش فرض یا صعودی (از کوچک به بزرگ)
ASC: مرتب سازی نزولی (از بزرگ به کوچک)
RAND: مرتب سازی به صورت اتفاقی (رندوم)
به مثال های زیر توجه کنید.
نحوه استفاده از DESC برای مرتب سازی و نمایش نتایج به صورت چینش صعودی:
<?php 
mysql_query("SELECT * FROM table WHERE name != '' ORDER BY age DESC");
?>
نحوه استفاده از ASC برای مرتب سازی و نمایش نتایج به صورت چینش نزولی:
<?php 
mysql_query("SELECT * FROM table WHERE name != '' ORDER BY age ASC");
?>
نحوه استفاده از تابع RAND برای مرتب سازی و نمایش نتایج به صورت چینش اتفاقی:
<?php 
mysql_query("SELECT * FROM table WHERE name != '' ORDER BY RAND()");
?>

استفاده از LIMIT


استفاده از دستور ORDER BY به تنهایی و بدون محدود کردن تعداد نتایج، می تواند منجر به نمایش تعداد خیلی زیادی از اطلاعات با یک درخواست از دیتابیس شود، از این رو یک پارامتر دیگر به نام LIMIT را می توانیم به دستور خود اضافه کنیم، LIMIT تعداد ردیف هایی را که به عنوان نتایج یک پرس و جو از دیتابیس به دست می آید، محدود می کند، به فرض دستور زیر:
<?php 
mysql_query("SELECT * FROM table WHERE name != '' ORDER BY RAND() LIMIT 5");
?>
تنها 5 کاربر را به صورت اتفاقی انتخاب می کند، همچنین می توان نقطه شروع انتخاب ردیف ها را نیز به mysql تفهیم کرد، بدین منظور برای LIMIT از دو عدد استفاده می کنیم، عدد اول مقادیر ردیفی است که با توجه به ORDER BY آن را انتخاب کرده ایم (به فرض شروع از سن 35 سال) و عدد دوم تعداد نتایجی است که پرس و جو را به آن محدود کرده ایم (به فرض 5 عدد).
<?php 
mysql_query("SELECT * FROM table WHERE name != '' ORDER BY age ASC LIMIT 35,5");
?>
با استفاده از این شیوه به صورت داینامیک، می توان قابلیت هایی مثل نمایش صفحه به صفحه مطالب را ایجاد نمود که در بحث آموزش های کاربردی در این باره خواهیم گفت.

استفاده از AND و OR


شیوه نگارش (syntax) دستورات php در هنگام کار با mysql این اجازه را به ما می دهد که همانند علامت های && و || از دو عبارت AND و OR در یک query استفاده کنیم، البته نحوه کاربرد آنها در اینجا کمی متفاوت است اما هدف از به کارگیریشان یکی است، از AND برای محدودتر و دقیق تر کردن نتایج و از OR برای وسیع تر کردن شمول نتایج یک پرس و جو استفاده می شود، به فرض اگر بخواهیم فقط کاربران دارای سن بالاتر از 40 و پائین تر از 20 را نمایش دهیم، می نویسیم:
<?php 
mysql_query("SELECT * FROM table WHERE name != '' AND age > 40 OR name != '' AND age < 20 ORDER BY age");
?>
دستور بالا، کاربرانی را که سن آنها بالاتر از 40 یا پائین تر از 20 باشد، در لیست نتایج پرس و جو از پایگاه داده نمایش می دهد.

استفاده از GROUP BY


یک قابلیت کاربردی دیگر که در دسته بندی و نمایش بهتر نتایج حاصل از پرس و جوی پایگاه داده می توان از آن استفاده کرد، قابلیت گروه بندی نتایج دارای وجه مشترک در یک نتیجه است، این قابلیت توسط پارامتر GROUP BY به دست می آید، به فرض اگر بخواهیم گروه بندی را بر اساس شهر کاربران داشته باشیم، خواهیم نوشت:
<?php 
mysql_query("SELECT * FROM table WHERE name != '' GROUP BY city ORDER BY age");
?>
به این صورت از بین کاربران یک شهر، تنها یک عضو با توجه به نحوه چینش دستور ORDER BY انتخاب شده و در نتایج نشان داده می شود.
مثال دیگر از کاربرد GROUP BY در mysql:
<?php 
mysql_query("SELECT id,name,age FROM table WHERE name NOT LIKE '%Akbar%' GROUP BY city ORDER BY age ASC LIMIT 5");
?>
در هنگام استفاده از قابلیت GROUP BY و ORDER BY باید دقت کنید که از آنها به ترتیب استفاده شود، در غیر اینصورت mysql خطای syntax را نمایش خواهد داد.
توابع مربوط به GROUP BY را در اصطلاح توابع تجمعی یا aggregate functions می گویند (شامل COUNT، MAX، MIN، SUM، AVG و...) که در آموزش های بعدی به تفصیل در مورد آنها خواهیم گفت.
sectionدسته بندی: آموزش مقدماتی » MySQL
related مطالب بیشتر:
» ساخت دیتابیس، جدول و ردیف با دستور CREATE در MySQL
» نحوه ذخیره کردن اطلاعات با دستور INSERT در MySQL
» انتخاب ردیف ها با دستور SELECT FROM در MySQL
» حذف مقادیر از MySQL با دستور DELETE
» استفاده از JOIN و ساخت پرس و جوی ترکیبی در MySQL
commentنظرات (۱۳ یادداشت برای این مطلب ارسال شده است)
نویسنده: ansherli
زمان: ۲۲:۴۲:۰۷ - تاریخ: ۱۳۹۱/۱۱/۲۸
سلام
ببخشید من می خواستم بدونم چطور میشه تعداد پست ها رو محدود کرد مثلا توی یه صفحه 10 تا پست قرار بگیره
و پایین صفحه به این صورت باشه
prev 1 2 3 4 5 … 74 next
توی مطالب سایت خیلی گشتم ولی نتونستم پیدا کنم .
ممنون میشم راهنماییم کنید.
پاسخ: 
سلام
این مورد هنوز در آموزش های سایت منتشر نشده.
به دلیل (کمی) پیچیده بودن مبحث، واقعا امکان طرح آن در این قسمت نیست و نیاز به توضیح کامل دارد، لذا یا باید منتظر انتشار آن در مطالب آینده باشید یا اینکه در وب جستجو کنید.
نویسنده: حسین
زمان: ۱۹:۲۹:۱۸ - تاریخ: ۱۳۹۲/۰۵/۰۷
یه دنیا باز ممنونم.
امیدوارم لبتون خندون باشه.
نویسنده: شکوفه
زمان: ۱۳:۰۱:۵۶ - تاریخ: ۱۳۹۲/۰۶/۳۰
ممنون از آموزشهای خوبتون
نویسنده: masiha68
زمان: ۱۴:۳۵:۰۶ - تاریخ: ۱۳۹۲/۰۷/۱۵
طبق معمول ... فوق العاده
نویسنده: خلیل
زمان: ۲۰:۳۹:۰۰ - تاریخ: ۱۳۹۲/۰۷/۳۰
خیلی ممنون
نویسنده: سيد عباس
زمان: ۱۶:۰۶:۲۳ - تاریخ: ۱۳۹۲/۰۸/۰۶
دوست واستاد گرامي سلام من يه كد دارم ميخوام وقتي مثلا مطلب جديدي پست ميكنم بياد اول در كد زير بايد چه تغييري بدم لازم به ذكر است با پست هر مطلب اطلاعات جدول از قديمي به جديد نمايش داده ميشه ميخوام در واقع برعكس اين بشه يعني هر پستي كه ارسال ميكنم بياد اول جدول
حذف شد
چه تغييري بايد در كد بالا بدم؟؟؟
از شما ممنون !!! لازم به ذكره با كمك هاي شما تا حالا تونستم يك مديريت محتواي ساده راه اندازي كنم.
با تشكر اوس
پاسخ: 
سلام
هرچند پاسخ دقیق به سوال شما نیاز به بررسی آنلاین تغییرات در خروجی دارد، اما به نظر با استفاده از ORDER BY و ASC یا DESC می توانید این کار را انجام دهید:
$query_Recordset1 = "SELECT * FROM page_index ORDER BY id ASC";
نکته: ستون id می تواند در جدول شما نام دیگری داشه باشد (معمولا id شماره یکتای هر مطلب از کوچکتر به بزرگتر است).
نویسنده: علی امینی
زمان: ۱۳:۲۰:۱۱ - تاریخ: ۱۳۹۲/۰۸/۰۹
با سلام
واقعا دستتون درد نکنه.
الان که بیشتر دقت میکنم میبینم که تو آموزش شما بهترین هستید.
واقعا کارتون عالیه.
ایشالا همیشه موفق باشید
یا علی
نویسنده: مهران
زمان: ۱۶:۴۴:۲۹ - تاریخ: ۱۳۹۳/۰۲/۲۱
سلام خسته نباشید.
من با دستور LIMIT تعداد رکورد های دریافتی رو 10 قرار دادم. حالا سوال اینه اگر قصد دسترسی به 10 رکورد بعدی رو داشته باشم باید چیکار کنم؟؟ و به همین ترتیب..
ممنون میشم راهنماییم کنید.
پاسخ: 
سلام
لطفا مطلب را با دقت مطالعه کنید، دستور LIMIT دو پارامتر دارد، در صورتی که هر دو پارامتر تنظیم شود، عدد اول نقطه شروع انتخاب ردیف ها و عدد دوم تعداد آنها است، برای کسب اطلاعات بیشتر، عبارت "صفحه بندی" را در قسمت جستجوی سایت وارد کنید.
نویسنده: علی احمدی
زمان: ۱۴:۱۹:۱۲ - تاریخ: ۱۳۹۳/۱۲/۲۵
سلام
این دستور رو نوشتم ولی زمانی که داده ها نمایش داده میشوند باز مرتب نشون نمیده
$res=mysql_query("select * from sabt where id=$id Order By id");
پاسخ: 
سلام
در پرس و جو از علامت = استفاده شده و این یعنی تنها یک مقدار مورد نظر است (در این حالت تنها یک ID یا ID های مشابه انتخاب می شوند)، که چینش در چنین حالتی ممکن نیست!
نویسنده: علی احمدی
زمان: ۱۱:۲۱:۱۶ - تاریخ: ۱۳۹۳/۱۲/۲۶
سلام دوباره
بدون شرط هم امتحان کردم ولی باز مرتب نمیکنه طرز صحیح نوشتن کد با شرط و بدون شرط رو اگه ممکنه بهم بگین. ممنون
res=mysql_query("select * from sabt  Order By id");
پاسخ: 
سلام
به نظر مشکل دیگری در برنامه یا دیتابیس شما وجود دارد، اگر ID به صورت INT باشد و مقادیر آن متفاوت، اصولا باید چینش در یکی از حالت های آموزش داده شده صورت گیرد.
نویسنده: علی احمدی
زمان: ۱۴:۱۷:۲۴ - تاریخ: ۱۳۹۴/۰۱/۱۰
با سلامی دوباره
مشکل اینجا بود که id از نوع int نبود. حل شد. خیلی خیلی ممنون از لطف شما
نویسنده: کارجو
زمان: ۱۷:۳۰:۵۵ - تاریخ: ۱۳۹۴/۰۶/۱۱
ممنون. خیلی مفید بود.
نویسنده: نیما
زمان: ۰۰:۵۰:۲۶ - تاریخ: ۱۳۹۴/۱۰/۲۴
با سلام چرا وقتی از rand دقیقا مثل آموزش شما استفاده میکتم به من اخطار syntax میده
دقیقا این
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'rand()' at line 1
پاسخ: 
سلام
در این قسمت یک اشکال جزئی وجود داشت که با یادآوری شما اصلاح شد!، از نمونه کد فعلی استفاده کنید.




more لطفا دقت کنید که یادداشت های زیر منتشر نشده و حذف خواهند شد:
- یادداشت های خارج از موضوع این مطلب.
- سوالات کلی، غیر ضروری و مشکلاتی که هیچ تلاشی برای رفع آن نکرده باشید.
- نظرات حاوی کدها و اسکریپت های خیلی طولانی (به طور مثال کد کامل قالب وبلاگ).

8 × 4
 refresh
آگهی
seonab.com
طراحی نرم افزار اندروید
رنگین کمان عکس
Ranginkamaan.com

آرشیو عکس های باکیفیت با موضوعات متنوع...