• php
  • 3195
  • 29/6/2008
  • flasher
  • بسم الله الرحمن الرحيم استخدام قيمة الحقل عند تحديثه ! هل تعلم انه يمكنك استخدام قيمة الحقل عند تحديثه ، ستقول كيف ؟ .. حسنا المعروف دائما هو
    UPDATE TABLE SET FIELD = \"قيمة جديدة\";

    لكن ماذا لو اردت استخدام قيمة الحقل واضافة عليها شئ جديد مثلا .. لدي جدول يحتوي على اسماء دكاترة واريد اضافة ال prefix التالي : \"د.\" بكل بساطة :
    UPDATE TABLE SET FIELD = CONCAT(\"د.\" , FIELD) ;

    اظن الفكرة اتضحت الان فالعملية SET تشبه عملية الاسناد في البرمجة (=) حيث يمكنك استعمال صيغة مباشرة \"قيمة جديدة\" او صيغة معقدة وحتى عملية رياضيه اذا كان المحتوى عبارة عن ارقام .. فمثلا لو اردنا استعمال حقل كعداد لزيارات موضوع معين عندها يمكننا زيادة العداد بدون ان ناخذ القيمة القديمة
    UPDATE TABLE SET FIELD = FIELD + 1 ;

    * اضافة :
    ايضا يمكننا استخدام دالة Replace لاستبدال جزء معين من الحقل بجزء جديد
    مثال لدالة Replace
    SELECT REPLACE(\"www.Flasher.ws\" , \"Flasher\" , \"Abdulaziz\")

    مثال لاستبدال حقل
    UPDATE TABLE SET FIELD = REPLACE(FIELD , \"Search\" , \"Replace\")

    Joins
    يمكن باكثر من طريقة دمج عدة جداول مع بعضها البعض او حتى دمج جدول مع نفسه ! ( غريب اليس كذلك) أولا تحتاج الى هذه الجداول مكونه لديك (لغرض الامثلة فقط) :
    CREATE TABLE `employee` (`name` VARCHAR (50),
    `id` INT (4) AUTO_INCREMENT,
    `salary` INT (4) DEFAULT \'0\',
    PRIMARY KEY(`id`));
    CREATE TABLE `items` (`id` INT (4) AUTO_INCREMENT,
    `employee_id` INT (4),
    `data` TINYTEXT, PRIMARY KEY(`id`));

    INSERT INTO `employee` (`name`,`id`,`salary`) VALUES (\'Ahmed\',NULL,0);
    INSERT INTO `employee` (`name`,`id`,`salary`) VALUES (\'Abdulaziz\',NULL,0);
    INSERT INTO `employee` (`name`,`id`,`salary`) VALUES (\'Mohammed\',NULL,0);

    INSERT INTO `items` (`id`,`employee_id`,`data`) VALUES (NULL,1,\'Labtop \')
    INSERT INTO `items` (`id`,`employee_id`,`data`) VALUES (NULL,1,\'Car \')
    INSERT INTO `items` (`id`,`employee_id`,`data`) VALUES (NULL,2,\'Desk \')

    Inner-Join هو دمج جدول مع جدول اخر عندما يتم توفر كل الجانبين بمعنى لا بد ان يربط الجدول الاول بالجدول الثاني والجدول الثاني يربط بالاول (باختصار يتم استبعاد اي سجل لا يوجد له رابط على الجدول الاخر)
    مثال
    mysql> Select * from employee,items where employee.id = items.employee_id
    -> ;
    +-----------+----+--------+----+-------------+---------+
    | name | id | salary | id | employee_id | data |
    +-----------+----+--------+----+-------------+---------+
    | Ahmed | 1 | 0 | 1 | 1 | Labtop |
    | Ahmed | 1 | 0 | 2 | 1 | Car |
    | Abdulaziz | 2 | 0 | 3 | 2 | Desk |
    +-----------+----+--------+----+-------------+---------+
    3 rows in set (0.00 sec)
    تلاحظ انه تم ظهور Ahmed مرتين لوجود سجلين له في جدول items
    وظهور Abdulaziz مرة واحده لوجود سجل واحد فقط في جدول items
    لكن \'Mohammed\' لم يظهر له شئ لان لايوجد item يربط به * ملاحظة يمكن كتابة الكود اعلاه بشكل اخر :
    SELECT employee.*,items.* FROM employee JOIN items ON employee.id = items.employee_id


    Left-Join مايميزها عن Inner Join أنها لاتشترط حضور سجل من الطرف الاخر
    mysql> SELECT employee.*,items.* FROM employee LEFT JOIN items ON employee.id =
    items.employee_id ;
    +-----------+----+--------+------+-------------+---------+
    | name | id | salary | id | employee_id | DATA |
    +-----------+----+--------+------+-------------+---------+
    | Ahmed | 1 | 0 | 1 | 1 | Labtop |
    | Ahmed | 1 | 0 | 2 | 1 | Car |
    | Abdulaziz | 2 | 0 | 3 | 2 | Desk |
    | Mohammed | 3 | 0 | NULL | NULL | NULL |
    +-----------+----+--------+------+-------------+---------+
    4 rows IN SET (0.00 sec)


    تلاحظ انه ظهر السجل الخاص ب Mohammed وحقول جدول items كلها NULL
    من فوائد Left Join يمكنك حساب عدد السجلات المرتبطة بسجل رئيسي مثل سجل الموظف
    Mohammed
    mysql> SELECT employee.*,count(items.id) AS itemsNumber
    FROM employee LEFT JOIN items ON employee.id = items.employee_id
    GROUP BY employee.id;
    +-----------+----+--------+-------------+
    | name | id | salary | itemsNumber |
    +-----------+----+--------+-------------+
    | Ahmed | 1 | 0 | 2 |
    | Abdulaziz | 2 | 0 | 1 |
    | Mohammed | 3 | 0 | 0 |
    +-----------+----+--------+-------------+
    3 rows IN SET (0.00 sec)
    ونفس الفكرة عند حساب تعليقات موضوع في المنتديات مثلا . Right-Join ادائها معاكس ل Left Join حيث انها تشترط وجود سجل في الجانب الايمن (Items)ولاتشترط وجود شئ في الجانب الايسر (Employee). اضافة جملة Where عند حاجتك لاستخدام جملة where لابد من استخدامها بعد ال Join
    SELECT employee.*,count(items.id) AS itemsNumber
    FROM employee LEFT JOIN items ON employee.id = items.employee_id
    WHERE employee.salary > 1000
    GROUP BY employee.id;


    Self-Join دمج الجدول مع نفسه ..
    سنضيف تعديلا على جدول الموظفين (سنضيف حقل لرقم المدير) طبعا المدير سيكون احد الموظفين لذلك لاداعي لانشاء جدول للمدراء
    ALTER TABLE `employee` ADD `manager_id` INT(4)
    الان اعط كل من Ahmed و Abdulaziz رقم المدير الخاص بهم هو 3 أي ان محمد هو مديرهم جميعا
    UPDATE `employee` SET `manager_id`=3 WHERE `id`=1;
    UPDATE `employee` SET `manager_id`=3 WHERE `id`=2


    الان سنقوم بعملية دمج الجدول مع نفسه ليخرج لدينا جدول جديد اسمه جدول المدراء
    mysql> SELECT employee.*,managers.name AS managerName FROM employee
    -> LEFT JOIN employee AS managers ON managers.id = employee.manager_id;
    +-----------+----+--------+------------+-------------+
    | name | id | salary | manager_id | managerName |
    +-----------+----+--------+------------+-------------+
    | Ahmed | 1 | 0 | 3 | Mohammed |
    | Abdulaziz | 2 | 0 | 3 | Mohammed |
    | Mohammed | 3 | 0 | NULL | NULL |
    +-----------+----+--------+------------+-------------+
    3 rows IN SET (0.00 sec)

    اتمنى وفقت في كتابة شئ مفيد وجديد
    وللحديث بقية.
    المصدر: http://www.flasher.ws/main/articles/10-استعلامات-MySQL-بشكل-متقدم---1
    عدد المقيّمين 3 وإجمالي التقييمات 6
    12345