إستفسار : إستعلام لجلب آخر موضوع من كل تصنيف.

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

لقد قمت ببرمجة موقع فيديوهات بسيط من باب تطبيق ماتعلمت في PHP و MySQL، قمت بإنشاء جدول يحتوي على

id - link - category

بحيث :

id : هو الرقم المميز لكل فيديو.

link : رابط الفيديو (الموقع أضع فيه فيديوهات اليوتيوب :)).

category : هو التصنيف الخاص بكل فيديو.

لنفرض أن لدي 10 مواضيع موزعين على ثلاث تصنيفات، أريد إستعلام يمكنني من استخراج آخر موضوع من كل تصنيف وأيضا أريد أن يشتغل بغض النظر عن عدد التصنيفات حيث يمكن أن تنقص أو أن تزيد.

شكرا لكم.

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

أظن أن عليك أن تضيف عمودا في القاعدة يحمل توقيت الإضافة time (إن لم يكن هناك عمود مشابه مسبقا)

ثم تستخرج العلومات من القاعدة، ثم ترتبهم من الأحدث إلى الأقدم عبر هذا العمود DESC ثم تحد الخيارات إلى عنصر واحد

على ماأعتقد بهذا سأستخرج آخر المواضيع من الجدول بكامله وليس من التصنيف بنفسه. أنا أريد إستخراج البيانات بهذا الشكل :

لنفرض أن لدي ثلاث تصنيفات (رياضة، ترفيه، برمجة) إذن المخرجات ستكون

  • رياضة

هنا آخر فيديو للتصنيف.

  • ترفيه

هنا آخر فيديو للتصنيف.

  • برمجة

هنا آخر فيديو للتصنيف.

وأريد هذا من خلال إستعلام واحد فبإمكاني إستخراج البيانات بالشكل أعلاه ولكن سيلزمني إستعلام لكل تصنيف وهذا مالاأريده.

لست ضليعا بالبرمجة لذا اعذرني

ولكن أولا ستقوم باستخراج مواضبع كل التصنيف، ثم ترتب ما استخرجته وتختار أول موضوع، وتقوم بنفس الشيء مع كل تصنيف

طبعا الأمر سيستهلك الكثير من القاعدة، حتى يأتي شخص ما ويطرح حل أفضل

لا حاجة لإستعمال حقل جديد يحتوي تاريخ إنشاء الفيديو يمكن إستعمال حقل id الخاص بالفيديو لتحديد أخر الفيديوات المضافة لكن يجب أن يكون AUTO_INCREMENT .

أيضا يفضل فصل categories في جدول خاص .

إذا سيكون عندنا جدولان بالشكل التالي :

    CREATE TABLE categories (
      id int(10) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(150) COLLATE utf8_bin NOT NULL,
      PRIMARY KEY (id)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

    CREATE TABLE videos (
      id int(10) unsigned NOT NULL AUTO_INCREMENT,
      link varchar(500) COLLATE utf8_bin NOT NULL DEFAULT '',
      category_id int(11) NOT NULL,
      PRIMARY KEY (id)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

بالنسبة للإستعلام الذي يستخرج اخر الفيديوات فهو كالتالي :

    SELECT `v`.*,`cat`.`name`
    FROM `videos` AS `v`
    INNER JOIN
    (
        SELECT max(`id`) AS `MaxVideoID`,`category_id`
        FROM `videos`
        GROUP BY `category_id`
    ) `v2`
    ON `v`.`category_id` = `v2`.`category_id`
    AND `v`.`id` = `v2`.`MaxVideoID`
    INNER JOIN `categories` AS `cat`
    ON `cat`.`id` = `v`.`category_id`
    order by `v`.`id` desc

كما قال الاخ @assassinateur , يجب اضافة حقل لتخزين تاريخ/وقت اضافة كل صف (row)

بعدها ننتقل الى الاستعلام , اول الامر يجب ترتيب البيانات حسب التصنيف و تاريخ/وقت تصاعديا الاضافة

SELECT * FROM my_table ORDER BY category, created_on DESC;

و من ثم نستعمل جملة group by للحصول على اول صف من كل مجموعة حسب تصنيفها [انظر الصورة](http://i.imgur.com/GK1g8Mu....

SELECT tmp_table.* FROM 
    (SELECT * FROM my_table ORDER BY category, created_on DESC) tmp_table
GROUP BY category
ORDER BY category ASC;

مثال حي [انظر الرابط](http://sqlfiddle.com/#!2/d0...

شكرا جزيلا لك أخي الكريم هذا ماكنت أبحث عنه، لكني لم أفهم ماهو tmp_table فحسب ماأرى my_table هو الجدول. هل tmp_table هو إسم قاعدة البيانات أم ماذا ؟

tmp_table يمثل جدول مؤقت افتراضي , محتوياته هي ناتج الاستعلام

SELECT * FROM my_table ORDER BY category, created_on DESC

يمكنك الاطلاع اكثر على مفهوم الاستعلامات الفرعية من خلال الرابط