النتائج 1 إلى 7 من 7

الموضوع: سؤال عن إستعلام SQL

  1. #1

    سؤال عن إستعلام SQL



    السلام عليكم

    لدي جدولين لل TAG لكل موضوع
    حينما أود عرض الموضوع كنت أعمل إستعلام لجلب بيانات الموضوع
    وإستعلام أخر لجلب ال tags

    ولكني فكرت في عمل إستعلام واحد للأثنين
    عيبوها أنه سيكرر محتوي الموضوع بعدد ال tags

    مثلا لما بجيب بيانات الموضوع بيجيبها في سطر واحد فقط
    لكن لو إستعلام واحد بتتكرر 6 مرات مع كل tag وبيصبح هناك 6 سطور بدلاً من سطر واحد
    بأخذ أنا الأول وأعرض بياناته كلها
    ثم لوب لجلب ال tags منه

    الإستعلام

    كود PHP:
    SELECT   f.*, t.*, r.*,
                                                    
    u.unameu.useridu.usertitleu.avatardateline,
                                                    
    u.avatarwidthu.avatarheightu.udownloadu.uupload
                                                    FROM 
    `lib_filesf INNER JOIN `lib_usersu ON f.authorid u.userid )
                                                    
    INNER JOIN `tagresultr ON r.`softid` = f.`fileid` )
                                                    
    LEFT JOIN `tagt ON t.`tagid` = r.`tagid` )
                                                    
    WHERE `fileid`='$fileid' 
    الأن مشكلتي لو ما كان هناك tag يعود الإستعلام ب 0 سطر
    وبالتالي لا يتم عرض الموضوع

    كيف أقوم بضبطه بحيث لو ما لقيت شيئ في جدول في قاعدة البيانات يتجاهله





    __________________
    السيف أصدق أنباء من الكتب


  2. #2
    عضو فعال
    تاريخ التسجيل
    Jul 2008
    المشاركات
    1,109


    اخي الكريم معا اني مستخدمتش التاج لغيط دلوقتي بس هاحاول اقول ليك اعمل حقل لتاج في جدول المواضيع احسن عشان بدل ماتعمل استعلامين تعمل استعلام وحد وترايح دماغك





    __________________
    ســـــــبحان الله وبـــــــــحمده *سبـــــــــــحان الله العظيم
    لطلب البرمجة فقط
    helal-egypt@hotmail.com

  3. #3
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    947


    أخي الكريم .. أولاً طريقة عمل ال tags خطأ إذا عملت كل tag بسجل لحاله..
    كان يمكن عملها أولاً على شكل array و تحويلها الى متغير باستخدام join او implode ثم إدخالها الى القاعدة
    وعند استخدامها في البحث تكتب في الاستعلام :
    كود PHP:
    where $tag in(tag
    وهكذا سيكون لكل موضوع سجل واحد فقط لل tags

    اما اذا اردت عمل كل tag في سجل مع اني غير مقتنع بها تماماً لكن اليك حل بعد اخراج الاستعلام ..

    طبعا نتائج الإستعلام ستكون في loop ..

    لنفرض ان النتائج سيتم عملها كالتالي:

    كود PHP:
    $tags_arr = array();
    while(
    $row mysql_fetch_assoc($query))
    {
    array_push($tags_arr,$row['tag']);
    }
    $tags implode(",",$tags_arr); 
    الآن سيصبح لديك متغير واحد يحمل ال tags للموضوع وهو $tags
    والسجلات الاخرى للموضوع ستطبعها بدون loop
    خارج ال loop بطريقة عادية
    كود PHP:
    $row['title'];
    $row['picture']; 






    التعديل الأخير تم بواسطة مهندس مصرى ; 13-12-2008 الساعة 09:02 AM
    __________________
    قل اللهم مالك المُلك تؤتي الملك من تشاء وتنزع الملك ممن تشاء وتعز من تشاء وتذل من تشاء بيدك الخير انك على كل شىء قدير

  4. #4


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

    بالنسبة لسؤال لم تفهمني أخي

    الإستعلام نفسه لا يجلب شيئ أصلا من قاعدة البيانات
    لما لا يكون هناك تاج
    فالجدول lib_files يكون فيه حقل واحد بالطبع
    ولكن الجدول tag لو ما فيه حقول مربوطة بال lib_files تكون البيانات المستدعاه صفر لوجود أحد الجداول خالي من الإستعلام المطلوب
    لو فيه بيان يتم جلب سطر واحد أيضا فيه بيانات lib_files وبيانات tag
    لو فيه بيانين بيتم جلب سطرين وتكرار محتويات lib_files في السطرين ولكن تختلف في ال tag

    أتمني تكون الفكرة وصلت





    __________________
    السيف أصدق أنباء من الكتب

  5. #5
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    947


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

    بالنسبة لسؤال لم تفهمني أخي

    الإستعلام نفسه لا يجلب شيئ أصلا من قاعدة البيانات
    لما لا يكون هناك تاج
    فالجدول lib_files يكون فيه حقل واحد بالطبع
    ولكن الجدول tag لو ما فيه حقول مربوطة بال lib_files تكون البيانات المستدعاه صفر لوجود أحد الجداول خالي من الإستعلام المطلوب
    لو فيه بيان يتم جلب سطر واحد أيضا فيه بيانات lib_files وبيانات tag
    لو فيه بيانين بيتم جلب سطرين وتكرار محتويات lib_files في السطرين ولكن تختلف في ال tag

    أتمني تكون الفكرة وصلت
    جرب استخدام left join بدلاً من inner join
    واستخدم معها distinct





    __________________
    قل اللهم مالك المُلك تؤتي الملك من تشاء وتنزع الملك ممن تشاء وتعز من تشاء وتذل من تشاء بيدك الخير انك على كل شىء قدير

  6. #6


    عدلت علي الإستعلام ليكون أكثر وضوحاً

    للتوضيح

    كود PHP:
    SELECT f.*,
    u.*
    FROM `lib_filesf INNER JOIN `lib_usersu ON f.authorid u.userid )
    INNER JOIN (SELECT DISTINCT FROM `tagresult`) AS r ON (r.`softid` = f.`fileid`)
    LEFT JOIN (SELECT DISTINCT FROM `tag`) AS t ON t.`tagid` = r.`tagid` )
    WHERE `fileid`='2' 
    يعمل ولكن لو كان الجدول tagresult أو tag خالي لا يجلب شيئ ( أريده يجلب ويتجاهلهم )
    ولكنه هكذا يعمل ويجلب بالطبع صف واحد فقط

    كود PHP:
    SELECT f.*,
    u.*
    FROM `lib_filesf INNER JOIN `lib_usersu ON f.authorid u.userid )
    WHERE `fileid`='2' 
    كيف أتجاهل الجدولين لو كانوا خاليين





    __________________
    السيف أصدق أنباء من الكتب

  7. #7
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    947


    أخي الكريم
    جربت استخدام left join ?
    المشكلة لديك في inner join
    لانه يلزم في حالة inner join الا يعود بقيم فارغة في الجدولين
    لكن left join تعرض السجلات اذا كان الجدول (اليسار) به قيم في هذه السجلات فانه سيعرضها ويعرض ايضاً قيم الجدول اليمين المقابلة لها

    وright join عكسها سيعرض البيانات طبقاً لسجلات الجدول اليمين

    اما inner join التي تستخدمها فتعني انه اذا كان احد السجلات فارغاً سواء يسار او يمين فانه لن يجلبه ولن يجلب المقابل له أيضاً

    فحاول استخدام left join واذا اردت عدم عرضهم بعد جلبهم استخدم ال php لهذا الغرض بالدالة is_null او طابق المتغير بفراغ if($s=="") echo "null";

    للعلم يمكن عمل ذلك في mysql لكنه لن يجلب النتائج الفارغة اذا كتبت where column not null

    لكن الحل في استبدال ال inner join ب left join





    التعديل الأخير تم بواسطة مهندس مصرى ; 14-12-2008 الساعة 06:40 PM
    __________________
    قل اللهم مالك المُلك تؤتي الملك من تشاء وتنزع الملك ممن تشاء وتعز من تشاء وتذل من تشاء بيدك الخير انك على كل شىء قدير





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | دليل الكويت العقاري | مقروء | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض