• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
دستور GROUP BY
#1
سلام بنده از xampp استفاده میکنم در دیتابیسم جدولی دارم مثلا بنام jadval مربوط به امور یک دانشگاه. مثل زیر :
Name level
±+++++++++++++++++++++++++++++++++++++++++
کاردان. محمد
کارشناسی. حسین
کاردان. مهدی.
دکترا امید.
کارشناسی. طالب
دکترا. خاتم
کارشناس ارشد. عادل
کاردان محسن
حالا من میخام دانشجویان را بر اساس فیلد level گروه بندی کنم و مهم اینکه حتما اسامی دانشجویان هر گروه را نشان دهم دستور زیر را مینویسم اما از هر گروه فقط اسم یک کاربر را نشان میدهد. در حالی که من به تمام اسامی برابر گروه بندی بر اساس مدرک تحصیلی نیاز دارم.
Select * from jadval group by level
  پاسخ
تشکر شده توسط :
#2
کد:
SELECT `level`,GROUP_CONCAT(`name` SEPARATOR ',') FROM `jadval` GROUP BY `level`
یه نکته: تابع GROUP_CONCAT محدودیت سایز تا 1024 بایت داره.
به یـزدان که گر ما خرد داشتیم
کجـا این سر انجـام بد داشتیم؟
  پاسخ
تشکر شده توسط : undefined mohammad.mm540
#3
(۱۳۹۴ مرداد ۰۳, ۱۰:۵۰ ق.ظ)sara147 نوشته:
کد:
SELECT `level`,GROUP_CONCAT(`name` SEPARATOR ',') FROM `jadval` GROUP BY `level`
یه نکته: تابع GROUP_CONCAT محدودیت سایز تا 1024 بایت داره.

سلام استاد یعنی چی تابع محدودیت سایز دارد. یعنی وقتی سایزش به1024 بایت رسید چی میشه یعنی جایگزین ديگه ای نیست با php نميشه کاریش کرد من قراره حجم بزرگی را با این فرا خوانی کنم بالای یک میلیون خط شاید هم خیلی بیشتر تا سه میلیون rowممنونم از وقتی که میگذارید سعیم بخاطر نوشتن صحیح این دستور بخاطر همین حجم بالا و بحث زمان است اگه کمکم کنید ممنون میشم.یعنی my sql هیچ تابع دیگر ای برای این نوع گروه بندی نداره؟! نميشه از فایل پیکربندی mysql این محدودیت را برداشت؟
  پاسخ
تشکر شده توسط :
#4
خروجی این تابع تا حداکثر طولی که در متغییر سیستمی group_concat_max_len مشخص شده، قطع میشه. که بطور پیش فرض 1024ـه. این مقدار میتونه بیشتر هم بشه.
برای افزایش مقدار این متغیر شما این دستور رو قبل از کوئری موردنظر اجرا میکنید. که عددی هم که میدید(val) از نوع unsigned integer هست.
کد:
SET group_concat_max_len = val;
البته رسیدن به حداکثر این مقدار بستگی به max_allowed_packet هم داره.

اگر تعداد گروه زیاد نیست، میتونید هر گروه رو با یک کوئری بدست بیارید(where `level`)
راه حل دیگه ای من به ذهنم نمیرسه.
به یـزدان که گر ما خرد داشتیم
کجـا این سر انجـام بد داشتیم؟
  پاسخ
تشکر شده توسط :
#5
سلام. چرا نميتونم ارایه GROUP_CONCAT(NAME) را در حلقه foreach که مخصوص ارایه هاست ازش خروجی بگیرم راه خروجی گرفتن این تابع چیه آخه میخام اطلاعات دیگر رو هم بچسبونم به اسامی و اصلا هر اسم را در یک ردیف یک جدول نشون بدم ولی با دستورprint ] فقط اسامی$ROW[GROUP_CANCAT فقط اسم میاد و هیچ مانوری روش نميشه داد.
  پاسخ
تشکر شده توسط :
#6
خروجی این تابع یک فیلد متنی هست.
اگر میخواهد مانور بدین تا جایی که من میدونم از همون کوئری ساده به همراه where استفاده کنید.
به یـزدان که گر ما خرد داشتیم
کجـا این سر انجـام بد داشتیم؟
  پاسخ
تشکر شده توسط :
#7
(۱۳۹۴ مرداد ۰۵, ۰۱:۳۶ ق.ظ)mohammad.mm540 نوشته: سلام. چرا نميتونم ارایه GROUP_CONCAT(NAME) را در حلقه foreach که مخصوص ارایه هاست ازش خروجی بگیرم راه خروجی گرفتن این تابع چیه آخه میخام اطلاعات دیگر رو هم بچسبونم به اسامی و اصلا هر اسم را در یک ردیف یک جدول نشون بدم ولی با دستورprint ] فقط اسامی$ROW[GROUP_CANCAT فقط اسم میاد و هیچ مانوری روش نميشه داد.

اگر قصد استفاده از نتایج در حلفه را دارید نیازی به استفاده از تابع GROUP_CONCAT ندارید این تابع یه رکورد بر می گرداند که در حلقه انداختن آن معنایی ندارد.
سالهــــا مـــــى گــــــذرد، حادثه ها مى آید
انتظـــــار فـــــــرج از نیمـــــه خــــــرداد کشم

[عکس: ShowPicture.aspx?ID=52750d12-5d92-4286-9...height=100]
  پاسخ
تشکر شده توسط :


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان