| |||||||
| المدوّنات | البحث | مشاركات اليوم | اجعل كافة المشاركات مقروءة |
|
| | LinkBack | أدوات الموضوع |
| |||||
| إستعلامات mysql متقدمة كود PHP: | |||||
|
| |||||
|
السلام، هذه الخاصيه موجوده مع الاصدار الخامس من MySQL وتسمى inline select statement او embedded statement وتتعامل معها مثل الجدول الطبيعي فمثلا تستطيه ان تقول "اعطني كل اسم مستخدم اسمه يبدأ او ينتهي بخالد ولكن سجل بعد العام 2007" كود: select * from ( select * from records where register_date > "01-01-2007" ) as smaller_table where smaller_table.username LIKE "%khalid%" Limit 0,10 الاستخدام سهل. ولكن له عيوب ومساوء وايظاً ايجابيات، تخيل ان لديك جدول كبير. وتريد ان تأخذ معلومه من جدول وتطابقه بجدول أكبر. مثلا تريد ان تبحث عن عدد الاهدافه للفريق ليفربول بعد العام 2005، كما تعرف جدول الاعبين كبير وعدد الاهداف في جدول الاهداف كبيره جدا؟ فمثلا فعلت هذا كود: select count(*) from players,teams,goals where team.name = "liverpool" and players.team_id = team.id and goals.player_id = players.id and goals.date > "01-01-05" فلتسهيل العمليه هي في تقليل عدد السجلات التي تبحث فيها .. اي اذا عرفت انك ستبحث في جدول كبير ولكن تعرف ان كل الاهداف التي تريد ان تحسبها هي بعد العام 2005 .. فلماذا لا تبحث في المطلوب فقط؟؟ كود: select count(*) from players,teams, ( select * from goals where date > "01-01-05") as goals where team.name = "liverpool" and players.team_id = team.id and goals.player_id = players.id اخوك خالد التعديل الأخير تم بواسطة : hilaby بتاريخ 16-06-2008 الساعة 06:40 AM. سبب آخر: تعديل الاخطاء الاملائيه و تعديل لشرح افضل | |||||
|
| |||||
|
ماشاءالله عليك يا اخوي خالد دائما شرحك رائع الله يوفقك ان شاءالله
__________________ # محمد "محلل لنظم المعلومات" - برمجه وتحليل flash, flex, s e o, javascript, actionscript, php لمراسلتي إضغط هنا [ 1 ][فلاش] مقدمه : ما هي لغة الاكشن سكريبت وماهو الفلاش | |||||
|
| |||||
|
- ميزة الاستعلام الفرعي subselect اكثر من رائعة, لكن يجب عليك ان تعرف متى تستخدمها فهو ليس شائع الاستخدام في التطبيقات ... غالبا ما يتم الاستعلام من جدول بدلالة حقول معينه او يكون من جدولين مع الربط بينها ووضع الشرط اللازم , كما هو مثال hilaby يمكن ان يكون ببساطة كود PHP: كود PHP:
__________________ I Love PHP (d4d@hotmail.com) http://www.daif.net/ | |||||
|
| |||||
|
شكراً لك أستاذ hilaby ، وفعلاً كما قلت الـ cache مهمة في هذه الحالة لتحسين آداء الخادم وبما أنني مهتم بهذه النوعية من الإستعلامات فإنني بالطبع سأقرأ عن هذه الخاصية ، هل يمكنك أن تعطينا نبذة قصيرة عنها ( خاصية الـ cache ) ؟ ، أيضاً أنا مهتم بإستعلامات الـ join .. فكيف سأقوم بتطبيق الـ join على الإستعلام السابق ؟ أستاذ daif .. لا أعتقد أنه يمكن تطبيق هذه الخاصية على الجداول التي لايوجد بينها علاقات .. لنفرض أنه يوجد لدينا جدولان واحد للتصنيفات يحتوي كل حقل فيه على قيمة واحدة وهي اسم التصنيف ، وآخر للمقالات ويحتوي كل حقل فيه على قيمة واحدة وهي اسم المقال .. لوكان لدينا في جدول التصانيف البيانات : كود: code javascript كود: sessions in php cookies in javascript ![]() ولا بد أن أضيف أن هذه الطريقة في الإستعلام ( طريقة الإستعلام الفرعي ) ستختصر علي كثيراً من الشفرات ، سابقاً كنت لكي أستخرج البيانات بنفس الطريقة التي وضعتها ، كان علي أن أقوم بثلاثة إستعلامات ، وللتعامل مع كل إستعلام أستخدم الدوال mysql_fetch_array و mysql_free_result ، مما يعني تكرار نفس العملية على ثلاثة إستعلامات مختلفة ، أما الان فبإستعلام واحد وبطريقة واحدة للتعامل معه .. يمكنني أن أستخرج البيانات التي أريدها وكنت أستخرجها بواسطة الطريقة السابقة . طبعاً كم أشار أخي hilaby لابد من التعامل مع هذا النوع من الاستعلامات بحرص لانها تأخذ مساحة ليست بالبسيطة من الذاكرة ، وهذا ما سأقوم بالبحث والقراءة عنه مستقبلاً لكي أستطيع التعامل مع هذه النوع من الإستعلامات بالشكل الصحيح . | |||||
|
| |||||
|
السلام عليكم. الاخ dev11 انا شخصيا احب هذة المناقشات لانها اولا مفيده لمن يريد ان يتعلم المزيد، و مفيده لي كشخص سيرى وجهة نظر شخص اخر، ربما ساتعلم شياً انا سأكتب شيء اكثر تفصيلا بعد الدوام .. ولكن الى ذالك الوقت تستطيع ان تقرأ عن الcache وطريقه استخدامها بعد ناتج احد النقاشات التي قام بها احد الاعضاء في سوالف معي على الرابط كيف يمكن عمل ذلك في php - كلاس تصغير الصور - سوالف سوفت واذا اردت مدونه خاصه تتكلم فقط عن تحسين أداء الMySQL قم بقرائه مقالات المدونه MySQL Performance Blog فيها معلومات جدا قيمه | |||||
|
| |||||
|
dev11 نعم كما ذكرت لا بد من وجود رقم فريد في التصنيفات ويتم ادخاله في المقالات حتى تستطيع الربط بينها . هل يمكن أن تشرح ماذا تريد ان تفعل عمليا ! كما ذكرت ان استخدامات الاستعلام الفرعي ضيقة جدا .
__________________ I Love PHP (d4d@hotmail.com) http://www.daif.net/ | |||||
|
| |||||
|
شكرا لكم اخواني .. نورتونا بحديثكم المتقدم حول الاستعلامات اريد ان استفسر .. هل يمكن عمل تحديث لعدة صفوف باستعلام واحد ؟؟ ( طبعا التحديث لحقل بعدة قيم لكل صف و بدون استخدام لووب)
__________________ أهلا و سهلا بكم في :- موقع دار الأوائل ----------------- تفضل معنا خدمات الاستضافة مع تركيب و دعم خاص للبوابة العربية لكافة العملاء موقع خدمات العرب | |||||
|
| |||||
|
عبقري العرب "الرد على سؤالك - هل يمكن عمل تحديث لعدة صفوف باستعلام واحد ؟" كما اعرفه انه لا يوجد .. لانك اذا اردت ان تغير عده حقول مره واحده .. هذا يدل على خلل ما في هيكل قاعده البيانات او تصميمها .. لاننا كما نعلم . اذا وجد اكثر من سجل في جدول معين بنفس البيانات نظع تلك البيانات في جدول اخر ونربطه برابط اجنبي .. "foreign key" فانا لا ارى اي مثال او لا استطيع ان اتخيل مثال يدل على انك ستريد ان تغير سجلات ببيانات مختلفه يجمعها رمز موحد .. dev11 اجابتك سهله.. وانا احس ان المثال افضل من الشرح .. كود: SELECT * FROM teams, players LEFT JOIN (SELECT COUNT(*) as numberOfGoals FROM goals WHERE goals.date > "2005-01-01" GROUP BY goals.player_id) as goalsAfter2005 ON players.id = goalsAfter2005.player_id WHERE teams.name = "liverpool" and players.team_id = teams.id احس انك تتكلم عن جدول جديد موقت يحتوي على البيانات المطلوبه بطريقه الاستعلامات الفرعيه .. ثم ربطها بجدول موجود .. اضن ان المثال اللذي كتبته للاخ dev11 سيعطيك فكره. لنقم بمتابعه النقاش لانه من الاشياء الشيقه .. التي هي في اصل تخصصي الحالي | |||||
|
| |||||
|
فعلاً ، لا أعتقد أنه يمكن تحديث أكثر من سجل من خلال إستعلام واحد إلا إن كنت تريد وضع قيمة واحدة في جميع السجلات أو بعض السجلات المحددة .. كود PHP: inner join : لإستخراج السجلات من الجدولين left join : لإستخراج السجلات من الجدول الأيسر right join : لإستخراج السجلات من الجدول الأيمن الصيغة العامة لهذا النوع من الإستعلامات .. كود PHP: 1 - يتم تخزين البيانات عند إستخراجها من قاعدة البيانات لأول مرة في الذاكرة المخصصة لذلك ، وتقوم أنت بتحديد الحد الأقصى هذه الذاكرة ، أعتقد أن هذه هي النقطة التي أشار إليها الأستاذ hilaby بخصوص الذاكرة وآداء الخادم . 2 - عندما يتم الإستعلام من قاعدة البيانات .. يتم البحث عن النتائج في البيانات المخزنة من قبل ، إن وُجدت يتم أرسالها إليك وإن لم يتم إيجادها فإنه يتم تنفيذ الإستعلام و إستخراج البيانات ويتم تخزينها في الذاكرة . 3 - عند حدوث أي تحديث على الجدول من ( إضافة ، تعديل ، حذف ) .. فإنه يتم حذف البيانات المخزنة السابقة ويتم إستبدالها بالبيانات المحدثة تلقائياً ، وهذه خاصية جميلة ومفيدة ، في الواقع بسبب هذه النقطة بالذات سأقوم بالتركيز على إستخدام الـ mysql query cache في المستقبل ، طبعاً لابد من الإشارة إلى أن الفرق في السرعة سيكون كبيراً ومؤثراً ، خصوصاً إن كانت لديك قاعدة بيانات بحجم كبير وذات إستعلامات كثيرة ، لكن المشكلة أيضاً تكمن إذا كانت قاعدة البيانات تتحدث بإستمرار كل دقيقة ( خمس دائق ،عشر دقائق أو نصف ساعة ) مثلاً .. ، في هذه الحالة لا يحبذ إستخدام هذه الخاصية لأن الـ cache في هذه الحالة لا فائدة منه على الإطلاق ! فما فائدة تخزين شيء سيتم تحديثه بعد خمس دقائق ! 4 - الخيار query_cache_type في ملف الإعدادات إذا كانت قيمته 1 فإن الـ cache سيتم تنفيذه دائما عند إستخراج أي بيانات ، أما إن كانت القيمة 2 فإن البيانات المخزنة سيتم إستخراجها إذا تم طلبها فقط . كود PHP: لكن مع الأسف لم أستطع تطبيق الإعدادت على الخادم الموجود لدي ، فالخيار query_cache_type غير موجود في ملف my.ini الخاص بإعدادت mysql .. هل من حلول ؟ أستاذ daif .. ماهي الطريقة التي تتبعها في إستخدام الـ cache في برمجية القالب السهل ؟ التعديل الأخير تم بواسطة : dev11 بتاريخ 18-06-2008 الساعة 04:06 PM. | |||||
|
| |||||
|
dev11 في قواعد البينات يتم استخدام التخزين المؤقت (cache) عندما يكون الاستعلام بطيء ومعقد او يكون عليه معالجه وغالبا ما تكون المعالجه في php وليس في sql , وهذا يحدث قليلا بالاضافة الى ان السجلات الناتجه قليله بالنسبه للجدول نفسه , لكن بشكل عام استخدام الكاش في كل الاستعلامات سوف يستهل الكثير من الذاكره وهذا سوف يجعل وضع الخادم نفسه سيء . - القالب السهل عند عرض ملف html يتحقق من تاريخ تعديل الملف اذا كان اكبر من ملف cache سوف يعالج الملف ثم يحدث ملف الكاش وعندما يكون العكس يتعامل مع ملف الكاش مباشره . hilaby الكاش ليس لحل المشكلة في بنية البينات لكنه طريقة لتسريع علملية تتكرر باستمرا وانت في غنى عنها مثل: ناتج معالجة ملف لا يتم تحديثة الا نادرا مثل القالب السهل , او عرض بينات تحدث بوقت محدد مثل صفحة تداول يتم جلب اسعار الاسهم من قاعدة البينات كل 5 دقائق ثم تخزن في صفحة(تعتبر كاش) تعرض للجميع وكل 5 دقائق تحدث من جديد.
__________________ I Love PHP (d4d@hotmail.com) http://www.daif.net/ | |||||
|
| |||||
|
نعم ، الآنه فهمت الطريقة ، أنت تستخدم الدالة filemtime لايجاد تاريخ تعديل الملف ، اذا كان أكبر من ملف الـ cache يتم تحديثه ومن ثم عرضه والا يتم عرض ملف الـ cache ، الآن أرى أهمية إستخدام القوالب ، وفعلاً هذه الطريقة أفضل من إستخدام الـ mysql query cache لانها لاتستهلك كثيراً من الذاكرة على عكس النظام الاخر . حسناً ، كيف يمكننا تحويل الإستعلام التالي إلى join ؟ كود PHP: | |||||
|
| |||||
|
يمكن وبسهوله , الاستعلام التالي هو بالضبط نفس INNER JOIN أي أنك عندما تستخدم INNER JOIN فانك تستخدم . كود PHP: كود PHP: - كتبت الكود بدون تجربه فعلية لكن اعتقد انه سيعمل
__________________ I Love PHP (d4d@hotmail.com) http://www.daif.net/ | |||||
|
| |||||
|
للأسف لم يعمل الإستعلام السابق ، والجدول items يوجد به الحقل type ، تخطيط القاعدة موجود في هذا الموضوع ، أتمنى سماع رأيكم في تخطيط القاعدة الموجودة في الموضوع الذي ذكرته .
| |||||
|
| |||||
|
محاولة بسيطة لم تنجح .. cache.php كود PHP: كود PHP: | |||||
|
| |||||
|
وجدتها ! كود PHP: كود PHP: | |||||
|
| |||||
|
أعلم أن الموضوع إنحرف عن مساره الأصلي ، ففي البداية تحدثنا عن الإستعلام الفرعي ، ومن ثم إنتقلنا إلى الـ mysql query cache ، وبعد ذلك توجهنا للـ cache ، لكن دعونا نخرج بشيء مفيد من هذا الموضوع ، لنخرج بنظام cache بسيط يستعمل للتطبيقات البسيطة ، كنت قد وضعت النواة لهذا النظام في الرد السابق ، بإنتظار آراءكم وتطويراتكم .
| |||||
|
| |||||
|
السلام عليكم.. لماذا لا نستخدم خواص الPHP5؟ .. لماذا لا نطور نفسنا قليلا؟ الطريقه التي سأطرحها لكم هي فكره قديمه تكلمت عنها في الموضوع http://www.swalif.net/softs/swalif45...8/#post1584325 الكلاس يستخدم الكلاس المفتوح المصدر CacheLite الموجود في اكثر السرفرات ... واذا لم يجد لديك قم بكتاب كود: pear install Cache_Lite الكلاس اللذي عملته هو كود PHP: كود PHP: كود PHP: حملوا الملفات المرافقه اذا اردتم الملفات كلها. | |||||
|
| |||||
|
أستاذ hilaby ، هذه الطريقة أعرفها مسبقاً ، هدفي ليس الوصول إلى شيء جاهز ، هدفي هو معرفة كيف أصل بنفسي إلى هذا الشيء الجاهز الذي هو في حالتنا ( طريقة عمل الـ cache ) ، أنا مهتم بتعلّم طريقة تطوير الشفرة في ردي ما قبل السابق إلى دالة أو صِنف ليس لمجرد التطوير بل للتعلم ، لكي أتعلم كيفية التحويل في مثل هذه الحالات في المستقبل ، جزاك الله خيراً . سؤال للأستاذ daif بما أنه لديه خبرة في الـ cache والمطبقة في برمجية القالب السهل ، ما أود معرفته هو كيف يقوم القالب بمعرفة أنه قد حصل تحديث ما على قاعدة البيانات ؟ ، لقد فهمت الطريقة المبنية على التحقق من وقت تعديل الملف ، ولكنها لا تصلح الا اذا كان لدي ملفين ثابتين أو ملف واحد ووقت اقوم بتحديده ، في القالب السهل لا يتم تحديد الوقت ( حسب تجربتي ) بل يتم تحديث ملفات الـ cache عند حدوث تغيير في قاعدة البيانات ، قد يكون هذا الكلام خاطئاً فلست واثقاً منه إنما أظن ذلك . أتمنى من الأستاذ daif التوضيح بشيء من التفصيل . بالمناسبة .. لازلت مهتما بتحويل الإستعلام في أول رد في الموضوع إلى إستعلام بطريقة join . شكراً لكم جميعاً | |||||
|
| |||||
|
نسيت أن أشكرك على الـ class الذي وضعته ، جميل بالفعل وإستخدام موفق للخاصية __destruct ، شكراً لك مرة أخرى . بالمناسبة وبما أنك تطرقت للـ pear ، فإنني لا أزال أواجه مشاكل في تنصيبها ، خصوصاً أنني مضطر لإستخدام نظام الـ windows حالياً التعديل الأخير تم بواسطة : dev11 بتاريخ 26-06-2008 الساعة 03:02 AM. | |||||
|