قادم من سفر وليس في نفس للتفكير في دوال
ولكن وجدت هذا الخطأ لديك فقط فأحببت تنبيهك له
لا تضع دالة تنفذ داخل لوب لأنه هكذا ال explode سيتم تنفيذها عدة مرات
اسندها لمتغير افضل في هذه الحالة
قادم من سفر وليس في نفس للتفكير في دوال
ولكن وجدت هذا الخطأ لديك فقط فأحببت تنبيهك له
لا تضع دالة تنفذ داخل لوب لأنه هكذا ال explode سيتم تنفيذها عدة مرات
اسندها لمتغير افضل في هذه الحالة
__________________
السيف أصدق أنباء من الكتب
عزيزي رومنسي ksa
استعلمنا عن اسم المجله الرئيسيةكود PHP:
a.mag_title,
وهنا اردنا ان نجمع قيمة الزيارات للمجلة الرئيسية مع جميع الزيارات لجميع الاقسام الفرعه التي تنتمي للمجله الرئيسية
a.mag_visits = زيارات المجلة الرئيسيةكود PHP:
a.mag_visits + sum(b.mag_visits) as total_visits
+ = عملية حسابيه في mysql
sum(b.mag_visits) = جمع جميع الزيارات في المجلات الفرعيه
as total_visits = خصصنا هذا الاسم لنتاج العملية الحسابيه
اما
فاستعلمنا عن جدولين وهم بالحقيقه جدول واحد سمنيا الاول a والثاني bكود PHP:
FROM
magazines a, magazines b
لكي نفرق بين الزيارات للمجله الرئيسية والفرعيه (كذلك لاسم المجله، أضف الى ذلك اننا سنحتاجها في بناء الجملة الشرطيه)
والشرط كان
كود PHP:
WHERE
a.mag_parent_id=0 AND b.mag_parent_id=a.mag_id
ان تكون المجله هي مجله رئيسية اي انها لا تنتمي لأي مجلهكود PHP:
a.mag_parent_id=0
وبشرط ان
المجله الفرعيه تنتمي للمجله الرئيسية التي نستعلم عنها اي انها لا تنتمي لاي مجله اخرى سوى المجله التي هي في الاستعلام الحاليكود PHP:
.b.mag_parent_id=a.mag_id
ونجمعهم على اساس اسم المجلات
كود PHP:
GROUP BY
a.mag_title
وأخيرا
نقوم بترتيب النتائج تنازليا بحسب الاكثر زياراتكود PHP:
ORDER BY
total_visits DESC
باستخدام الاسم الذي سبق وخصصناه لناتج العملية الحسابيه وهو total_visits
------------
عزيزي مهندس مصري
بالتأكيد لن يعرضها لأن الشرط لن يتحقق في inner join
اتكلم عن
كود PHP:
AND b.mag_parent_id=a.mag_id
وبصراحه لم اخض بعد في ال left & right join![]()
__________________
مملكة الموت
=======================
100(سبحان الله وبحمده ،،، سبحان الله العظيم) = 0 سيئة
حياك الله اخي محب الله ورسوله ورمضان كريم وحمدا لله على سلامتك
انا فقط اعمل ذلك لتقليل عدد الاسطر لاستوفي شروط المسابقة![]()
__________________
قل اللهم مالك المُلك تؤتي الملك من تشاء وتنزع الملك ممن تشاء وتعز من تشاء وتذل من تشاء بيدك الخير انك على كل شىء قدير
طيب ما رايكم لنطور الكود قليلاً .. ونجعله يعرض حقل جانبي بعدد الملفات الداخلية لكل ملف رئيسي؟
عملتها ايضاً ..
كما وان هناك مشكلة انه اذا لم يجد ملف داخلي سيعرض القيمة العددية = null لان اصلا ناتج الجمع = null اذا لم يوجد ملفات داخلية في الملف الرئيسي
جرب بنفسك الكود وستجد انه يعطيك حقل الزيارات = null وكذلك اذا عملت (الكود المطلوب في هذه المشاركة ) وهو عدد الملفات الداخلية جنب كل ملف رئيسي سيعطيك null اذا لم يوجد ملفات داخلية ونريده ان يعطي 0 وكذلك في حالة الزيارات يعطينا زيارات الملف الرئيسي فقط
هل لديكم افكار![]()
__________________
قل اللهم مالك المُلك تؤتي الملك من تشاء وتنزع الملك ممن تشاء وتعز من تشاء وتذل من تشاء بيدك الخير انك على كل شىء قدير
عزيزي مهندس مصري
لقد ضعت قليلا
ارجو ان تشرح مرة اخرى
ولي عودة ان شاء الله
__________________
مملكة الموت
=======================
100(سبحان الله وبحمده ،،، سبحان الله العظيم) = 0 سيئة
طيب سابادر بوضع ما توصلت اليه طبعاً بعد ارق وسهر ليالي لاحل هذه المشكلة (مشكلة null) لانها عند عرض المجلات انا كنت اريد عملها ببرنامج في لوحة التحكم يعرض كل المجلات بحيث يعرض المجلات الرئيسية فقط وجنبها حقل بعدد الزيارات الكلي و كذلك عدد الملفات الفرعية
وواجهتني مشكلة (null) نتيجة الجمع في حالة اذا كان الملف ليس له ملفات فرعية وكان ملف رئيسي فقط واستطعت بالتغلب عليها بعد عشرات التجارب وسهر الليالي
تفضلوا ما توصلت له .. واذا كان عندكم حل آخر ارجو ذكره ..
نفذ الكود على قاعدة البيانات عندك ستجده سيعرض حقل اضافي باسم internal وبه عدد الملفات الفرعية لكل ملف رئيسي حتى وان لم يكن له ملفات فرعية سيكتب 0كود PHP:
select a.mag_title, if(isnull(tmp_count.internal_num),a.mag_visits,(a.mag_visits + sum( b.mag_visits ))) as total_visits,if(isnull(tmp_count.internal_num),0,tmp_count.internal_num) as internal
from magazines as a
left join magazines as b on b.mag_parent_id = a.mag_id
left join (select count(mag_id) as internal_num,mag_parent_id FROM magazines group by mag_parent_id) as tmp_count
on tmp_count.mag_parent_id = a.mag_id
where a.mag_parent_id =0
group by a.mag_title
order by total_visits desc
وساعود لشرح الكود لمن لم يفهمه![]()
التعديل الأخير تم بواسطة مهندس مصرى ; 09-09-2009 الساعة 12:17 AM
__________________
قل اللهم مالك المُلك تؤتي الملك من تشاء وتنزع الملك ممن تشاء وتعز من تشاء وتذل من تشاء بيدك الخير انك على كل شىء قدير
والله بطل.. لا اعتقد اني كنت سأتوصل لنفس الاجابه الا بعد مراجعة الوثائق الخاصه ب mysql والسهر لايام طوال بالضبط كما فعلت انت
وبما انك جاوبت على السؤال :]
ننتظر السؤال الجديد![]()
__________________
مملكة الموت
=======================
100(سبحان الله وبحمده ،،، سبحان الله العظيم) = 0 سيئة
طيب اولاً هل فهمتم المطلوب؟
كانت هناك مشاكل في الكود لديك ..
1- لا يمكنه عرض المجلات الرئيسية اذا كان عدد المجلات الداخلية لها =0
بسبب ان الربط المستخدم inner join كما تفضلت اي اذا لم يجد نتائج في الجدول الايمن سيتجاهل السجل كله ولن يعرضه (وهذا ما حدث عندما حاولت عرض ملف رئيسي ليس له ملفات فرعية),
لذلك الحل هو باستخدام left join حتى لا يشترط وجود قيمة للجدول الايمن.
2- بالاعتماد على النقطة 1 لا يمكن تحقيق المطلوب الثاني وهو عرض الملفات الداخلية لكل ملف رئيسي وان كان عدد الملفات الداخلية به =0
3- مشكلة واجهتني وهي اذا كان عدد الملفات الداخلية =0 يعطي نتائج الجمع = NULL و كذلك يعطي عدد الملفات الداخلية = NULL وهذا هو ما استغرق كل الوقت في الحل
اي جرب ازالة الشروط if(isnull واعملها نتائج جمع عادية فسيعطيك القيم null (فقط في حالة عدم وجود مجلات فرعية من المجلة الرئيسية) .. والسبب انك ستجمع القيمة على لا شىء (null)
لذلك عملت شرطين متداخلين اذا كان الملف رئيسي لا يحتوي على ملفات فرعية (null) فسيعطي قيمة الملف الرئيسي فقط ولا يحتاج لجمع قيم الملفات الفرعية
للعلم عمتها بطريقة اخرى بنفس الفكرة باستخدام when case
و اذا كان لدى احد طريقة اقصر او مختصرة ارجو التفكير بها ووضعها
__________________
قل اللهم مالك المُلك تؤتي الملك من تشاء وتنزع الملك ممن تشاء وتعز من تشاء وتذل من تشاء بيدك الخير انك على كل شىء قدير
بالنسبه لي فلله الحمد قد فهمت
واما هذه
فهي جديده عليكود PHP:
if(isnull(tmp_count.internal_num)
وما زلنا ننتظر السؤال الجديد
__________________
مملكة الموت
=======================
100(سبحان الله وبحمده ،،، سبحان الله العظيم) = 0 سيئة
جزاك الله خير اخوي DSQ8.com على الشرح![]()