الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استخدام Group_concat مع Offset و Limit

بدأه Xacker في 29 يناير 2009 · 4 رد · 1,164 مشاهدة · في قواعد بيانات MySQL
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه

لدي استعلام أقوم فيه باستخدام group_concat بالشكل التالي:

 

[color= #66cc66;].... UNION [color= #993333; font-weight: bold;]SELECT [color= #993333; font-weight: bold;]ALL [color= #cc66cc;]1[color= #66cc66;], group_concat[color= #66cc66;](table_name[color= #66cc66;])[color= #66cc66;], [color= #cc66cc;]3[color= #66cc66;], [color= #cc66cc;]4 [color= #993333; font-weight: bold;]FROM information_schema[color= #66cc66;].[color= #993333; font-weight: bold;]TABLES [color= #993333; font-weight: bold;]WHERE ta
ble_schema [color= #66cc66;]= [color= #ff0000;]'database'

فأحصل على قدر معين من الأسماء في الصفحة لنقل أنه 65

والعدد الكامل لأسماء الجداول في database هو 135 فيبقى عندي 70 أحاول الحصول عليهم باستثناء أول 65 بالشكل

 

[color= #66cc66;].... UNION [color= #993333; font-weight: bold;]SELECT [color= #993333; font-weight: bold;]ALL [color= #cc66cc;]1[color= #66cc66;], group_concat[color= #66cc66;](table_name[color= #66cc66;])[color= #66cc66;], [color= #cc66cc;]3[color= #66cc66;], [color= #cc66cc;]4 [color= #993333; font-weight: bold;]FROM information_schema[color= #66cc66;].[color= #993333; font-weight: bold;]TABLES [color= #993333; font-weight: bold;]WHERE ta
ble_schema [color= #66cc66;]= [color= #ff0000;]'database' OFFSET [color= #cc66cc;]66 [color= #993333; font-weight: bold;]LIMIT [color= #cc66cc;]70

لكن أحصل على خطأ بالاستعلام أعزوه لاستخدام group_concat مع offset و limit لسبب أو لآخر، الخطأ في الاستعلام لا يوضح أين المشكلة بالمناسبة.

هل هناك طريقة لجلب الجداول الباقية؟ جربت باستخدام NOT IN لكن أعتقد أني لم أستخدمها بالشكل الصحيح أو لا يجوز استخدامها هنا.

أتمنى النصح، وشكراً.

:)

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#2

وعليكــم السـلام ورحمة الله وبركاتـه..

اللي فهمته من كلامك ان الإستعلام الأول صحيح لكن المشكلة في الإستعلام الثاني ..

لإستخدام Limit يوجد 3 طرق :

LIMIT count |

LIMIT [offset,] count |

LIMIT count OFFSET offset

الاولى انك تحدد عدد الـ records التي تريدها وهنا سيتم استرجاع البيانات من اول الجدول .

الثانية استرجاع الـ records من مكان محدد وبعد ذلك نحدد عدد الحقول .

اما الحالة الأخيرة في مع استخدام OFFSET فهي تتبع LIMIT ..

LIMIT count OFFSET offset

يعني سنحدد اولا عدد السجلات التي نريدها وهي 70 لكن ليس من بداية الجدول انما من السجل 65

لأن LIMIT تبدأ من 0

فجرب التالي في استعلامك

LIMIT 70 offset 65

اغلب الاستعلامات التي تستخدم Group_Concat تستخدم معها Group By ..

وان شاء الله تتحلَ

تم تعديل هذه المشاركة بواسطة mana80 في 30 يناير 2009 في 01:02

I Say Nothing

#3

شكراً أخت mana80 على هذه الإجابة السريعة الواضحة،

على الرغم من أني قمت بتعديل الاستعلام إلا أن الخطأ استمر:

[color= #66cc66;].... UNION [color= #993333; font-weight: bold;]SELECT [color= #993333; font-weight: bold;]ALL [color= #cc66cc;]1[color= #66cc66;],group_concat[color= #66cc66;](table_name[color= #66cc66;])[color= #66cc66;],[color= #cc66cc;]3[color= #66cc66;],[color= #cc66cc;]4 [color= #993333; font-weight: bold;]FROM information_schema[color= #66cc66;].[color= #993333; font-weight: bold;]TABLES [color= #993333; font-weight: bold;]WHERE table
_schema[color= #66cc66;]=[color= #ff0000;]'database' [color= #993333; font-weight: bold;]LIMIT [color= #cc66cc;]70 OFFSET [color= #cc66cc;]66

لما قمت باستخدام GROUP BY حصلت على أول table_name ابتداء من offset 66 فقط.

أمر آخر انتبهت إليه هو موضوع group_concat_max_len :S فلم أكن أعلم بها وهي التي دفعتني أساساً إلى استخدام limit و offset في الاستعلام حتى أحصل على باقي الجداول. هل هناك من طريقة لتغييرها بدون استخدام SET وبدون سؤالي لماذا 52ccir.gif

أو طريقة أخرى عدا عن group_concat لتجميع الجداول في استعلام واحد.

تم تعديل هذه المشاركة بواسطة Xacker في 30 يناير 2009 في 02:56

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

اذا حصل اقتطاع في النتيجة المرجعة فهنا يتم تغيير قيمة المتغير group_concat_max_len لقيمة اكبر وذلك عن طريق استخدام SET واعذرني لا ادري عن طريقة اخرى غير استخدام SET .

اقتباس
لما قمت باستخدام GROUP BY حصلت على أول table_name ابتداء من offset 66 فقط.

لو اردت السجل رقم 66 تكون قيمة الـ OFFSET 65 ..

اقتباس
على الرغم من أني قمت بتعديل الاستعلام إلا أن الخطأ استمر:

ايه الخطأ اللي بيظهر عنك ؟

I Say Nothing

#5
mana80 كتب:
اذا حصل اقتطاع في النتيجة المرجعة فهنا يتم تغيير قيمة المتغير group_concat_max_len لقيمة اكبر وذلك عن طريق استخدام SET واعذرني لا ادري عن طريقة اخرى غير استخدام SET .

شكراً على التوضيح.

اقتباس
لو اردت السجل رقم 66 تكون قيمة الـ OFFSET 65 ..

لا في الواقع أريد ما تبقى من أسماء الجداول والذي يتم اقتطاعه، يعني في أول مرة حصلت على أول 65 جدول فأنا أريد الباقي، ولما استخدمت GROUP BY لم يظهر لي سوى الواقع عند الإزاحة 66 بينما ما أطلبه هو باقي الـ 135 أي 70 اسم (بفرض لم يتم الاقتطاع مرة أخرى هذه المرة)

ما الحل أخت mana ؟

اقتباس
ايه الخطأ اللي بيظهر عنك ؟

الإعلام بوجود خطأ دون الإشارة إلى مكانه أو سببه

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

مواضيع مشابهة