اذهب إلى المحتوى
  • 0

كيفية ربط جدول مع ثلاث جداول أخرى في MYSQL

Our World عالمنا

السؤال

ما الطريقة الصحيحة لربط جدول للعناصر مع ثلاث جداول للتقسيمات كالاتى:

جدول العناصر   item

item (item_id, item_name)

جداول التصنيفات        category, sub- category 1, sub-category 2  

category(category_id, category_name)

sub-category1(sub-category1_id, sub-category1_name)

sub-category2(sub-category2_id, sub-category2_name)

بحيث أستطيع ان استدعي اسفل العنصر  أسماء كل جداول التقسيمات التابعة له

تم التعديل في بواسطة Our World عالمنا
تنسيق الشيفرة وتوضيح العنوان
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

في حال كنت تريد أن يحوي العنصر عدة فئات من كل جدول على حدى لا بد من انشاء جدول ربط لكل جدول فئات على حدى:

items_categories (item_id, category_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (category_id) REFERENCES category(category_id)


items_sub_categories_1 (item_id, sub_category_1_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (sub_category_1_id) REFERENCES sub-category1(sub-category1_id)


items_sub_categories_2 (item_id, sub_category_2_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (sub_category_2_id) REFERENCES sub-category2(sub-category2_id)

 ثم الاستعلام عن العنصر مع ربط فئاته الثلاث ضمن الاستعلام كالتالي:

SELECT * FROM item
LEFT JOIN category ON item.item_id=category.item_id
LEFT JOIN sub-category1 ON item.item_id=sub-category1.item_id
LEFT JOIN sub-category2 ON item.item_id=sub-category2.item_id

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 14 ساعات قال Hassan Hedr:

في حال كنت تريد أن يحوي العنصر عدة فئات من كل جدول على حدى لا بد من انشاء جدول ربط لكل جدول فئات على حدى:


items_categories (item_id, category_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (category_id) REFERENCES category(category_id)


items_sub_categories_1 (item_id, sub_category_1_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (sub_category_1_id) REFERENCES sub-category1(sub-category1_id)


items_sub_categories_2 (item_id, sub_category_2_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (sub_category_2_id) REFERENCES sub-category2(sub-category2_id)

 ثم الاستعلام عن العنصر مع ربط فئاته الثلاث ضمن الاستعلام كالتالي:


SELECT * FROM item
LEFT JOIN category ON item.item_id=category.item_id
LEFT JOIN sub-category1 ON item.item_id=sub-category1.item_id
LEFT JOIN sub-category2 ON item.item_id=sub-category2.item_id

 

انت كده ربطت جدول الـ item  مع جداول التصنيفات الثلاث..

لماذا لم تربط جداول التصنيفات الثلاث مع بعضها البعض بحيث يتفرع عن التصنيف الرئيسي (category) تصنيفان تابعان هما

(sub-category1 & sub-category2)

  عشان لما اضيف الـ item  تبع تصنيف فرعي اعرف أوصل للأب والأب الأكبر  ؟

بتاريخ 14 ساعات قال Hassan Hedr:

في حال كنت تريد أن يحوي العنصر عدة فئات من كل جدول على حدى لا بد من انشاء جدول ربط لكل جدول فئات على حدى:


items_categories (item_id, category_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (category_id) REFERENCES category(category_id)


items_sub_categories_1 (item_id, sub_category_1_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (sub_category_1_id) REFERENCES sub-category1(sub-category1_id)


items_sub_categories_2 (item_id, sub_category_2_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (sub_category_2_id) REFERENCES sub-category2(sub-category2_id)

 ثم الاستعلام عن العنصر مع ربط فئاته الثلاث ضمن الاستعلام كالتالي:


SELECT * FROM item
LEFT JOIN category ON item.item_id=category.item_id
LEFT JOIN sub-category1 ON item.item_id=sub-category1.item_id
LEFT JOIN sub-category2 ON item.item_id=sub-category2.item_id

 

تقصد اني محتاج 3 جداول وسيطة زيادة على الجداول اللى انا ذكرت اسمائها فى السؤال الاول؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ الآن قال Our World عالمنا:

انت كده ربطت جدول الـ item  مع جداول التصنيفات الثلاث..

لماذا لم تربط جداول التصنيفات الثلاث مع بعضها البعض بحيث يتفرع عن التصنيف الرئيسي (category) تصنيفان تابعان هما

(sub-category1 & sub-category2)

  عشان لما اضيف الـ item  تبع تصنيف فرعي اعرف أوصل للأب والأب الأكبر  ؟

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

categories (category_id, parent_category_id, item_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (parent_category_id) REFERENCES categories(category_id)

مجددًا الأمر يعتمد على طبيعة المشروع والمطلوب منك

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

اللى تعلمته انى لما اربط جدولين اضع foreign key  واحد فى احد الجدولين واجعله يشير للجدول الاخر..

انت كده استخدمت two foreign keys واحد فى جدول الـ item  والتاني فى الجدول المربوط معه وهو الـ category   .. صح كده؟؟

بتاريخ 13 دقائق مضت قال Hassan Hedr:

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


categories (category_id, parent_category_id, item_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (parent_category_id) REFERENCES categories(category_id)

مجددًا الأمر يعتمد على طبيعة المشروع والمطلوب منك

لو عندك لينك لفيديوهات عملية.. اكون شاكر لو ارسلت اللينك

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 30 دقائق مضت قال Our World عالمنا:

اللى تعلمته انى لما اربط جدولين اضع foreign key  واحد فى احد الجدولين واجعله يشير للجدول الاخر..

انت كده استخدمت two foreign keys واحد فى جدول الـ item  والتاني فى الجدول المربوط معه وهو الـ category   .. صح كده؟؟

لو عندك لينك لفيديوهات عملية.. اكون شاكر لو ارسلت اللينك

الأمر يعتمد على طبيعة العلاقة بين الجدولين:

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

المقال التالي مفيد جدًا لك، حاول التمعن به وفهم أنواع العلاقات بين الجداول وكيفية تطبيقها:

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 3 ساعات قال Our World عالمنا:

اللى تعلمته انى لما اربط جدولين اضع foreign key  واحد فى احد الجدولين واجعله يشير للجدول الاخر..

انت كده استخدمت two foreign keys واحد فى جدول الـ item  والتاني فى الجدول المربوط معه وهو الـ category   .. صح كده؟؟

لو عندك لينك لفيديوهات عملية.. اكون شاكر لو ارسلت اللينك

 

بتاريخ 3 ساعات قال Hassan Hedr:

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


categories (category_id, parent_category_id, item_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (parent_category_id) REFERENCES categories(category_id)

مجددًا الأمر يعتمد على طبيعة المشروع والمطلوب منك

ممكن تكملة الجدول الهرمي الواحد مع كتابة الاستعلام 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 7 ساعات قال Our World عالمنا:

ممكن تكملة الجدول الهرمي الواحد مع كتابة الاستعلام 

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

SELECT * FROM items
LEFT JOIN categories as sub_category_1 ON sub_category_1.item_id = items.item_id 
LEFT JOIN categories as sub_category_2 ON sub_category_2.parent_category_id = sub_category_1.category_id
LEFT JOIN categories as sub_category_3 ON sub_category_3.parent_category_id = sub_category_2.category_id

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 15 ساعات قال Hassan Hedr:

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


categories (category_id, parent_category_id, item_id)
FOREIGN KEY (item_id) REFERENCES item(item_id)
FOREIGN KEY (parent_category_id) REFERENCES categories(category_id)

مجددًا الأمر يعتمد على طبيعة المشروع والمطلوب منك

قمت باضافة المفاتيح كما أوضحت..يعطيني رسالة

can't add or update a child row

#1452 - Cannot add or update a child row: a foreign key constraint fails (`project`.`#sql-dc8_186`, CONSTRAINT `#sql-dc8_186_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `items` (`item_id`))

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 دقيقة مضت قال Our World عالمنا:

قمت باضافة المفاتيح كما أوضحت..يعطيني رسالة

can't add or update a child row

#1452 - Cannot add or update a child row: a foreign key constraint fails (`project`.`#sql-dc8_186`, CONSTRAINT `#sql-dc8_186_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `items` (`item_id`))

حاول جعل الحقل item_id في الجدول categories يقبل NULL وستحل المشكلة، طريقة أفضل للقيام بذلك هو تغيير بنية الجدولين وإزالة item_id من جدول categories وإضافة حقل جديد category_id ضمن الجدول items يربط مع المعرف للجدول categories

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 13 ساعات قال Hassan Hedr:

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


SELECT * FROM items
LEFT JOIN categories as sub_category_1 ON sub_category_1.item_id = items.item_id 
LEFT JOIN categories as sub_category_2 ON sub_category_2.parent_category_id = sub_category_1.category_id
LEFT JOIN categories as sub_category_3 ON sub_category_3.parent_category_id = sub_category_2.category_id

 

لو عايز استدعي التصنيفات  مع بعض فقط دون الـ items  كيف يكون الاستعلام 

تم التعديل في بواسطة Our World عالمنا
خطأ فى الكتابة
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 8 دقائق مضت قال Our World عالمنا:

لو عايز استدعي التصنيفات  مع بعض فقط دون الـ items  كيف يكون الاستعلام 

بدّل الاستعلام select بالجدول الذي تريد ثم قم بعمل الربط ضمن الاستعلام باستخدام JOIN كالسابق مع الجدول نفسه

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 42 دقائق مضت قال Hassan Hedr:

بدّل الاستعلام select بالجدول الذي تريد ثم قم بعمل الربط ضمن الاستعلام باستخدام JOIN كالسابق مع الجدول نفسه

الرجاء كتابة الاستعلام.. جزاك الله خيرا

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 20 دقائق مضت قال Our World عالمنا:

الرجاء كتابة الاستعلام.. جزاك الله خيرا

لا يمكن حل الواجبات أو المهام، حاول بناء الاستعلام بنفسك وفي حال واجهت مشكلة ما يمكنك إرفاق نتيجتك واستفسارك حولها،

أنصحك بقراءة المقال التالي سيمكنك من فهم العلاقات بين الجداول وكيفية بناء الاستعلامات بينها بشكل صحيح

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 9 دقائق مضت قال Hassan Hedr:

لا يمكن حل الواجبات أو المهام، حاول بناء الاستعلام بنفسك وفي حال واجهت مشكلة ما يمكنك إرفاق نتيجتك واستفسارك حولها،

أنصحك بقراءة المقال التالي سيمكنك من فهم العلاقات بين الجداول وكيفية بناء الاستعلامات بينها بشكل صحيح

 

انا لا اطلب حل واجبات.. انا اتعلم ذاتيا والمصادر 90% منها نظري بدون تطبيق على موقع فعلي..

ثانيا: لكي استخدم join لابد ان يكون هناك اسمين مختلفين والجدول واحد وليس به الا حقل اسم واحد

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 40 دقائق مضت قال Our World عالمنا:

لكي استخدم join لابد ان يكون هناك اسمين مختلفين والجدول واحد وليس به الا حقل اسم واحد

ليس بالضرورة، المعامل JOIN يحدد علاقة بين طرفين ومن الممكن أن يكون الطرفين هما الجدول نفسه، فقط عليك أن تحدد شرط الربط أي تحديد الحقلين الذين يجب الربط عبرهما في كل طرف

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 7 دقائق مضت قال Hassan Hedr:

ليس بالضرورة، المعامل JOIN يحدد علاقة بين طرفين ومن الممكن أن يكون الطرفين هما الجدول نفسه، فقط عليك أن تحدد شرط الربط أي تحديد الحقلين الذين يجب الربط عبرهما في كل طرف

استخدمت هذا الاستعلام ولكن يعطي رسالة خطأ

SELECT * FROM categories AS sub_category_1, sub_category_2, sub_category_3
 JOIN categories as sub_category_1 ON sub_category_1.category_id = sub_category_1.parent_category_id 
 JOIN categories as sub_category_2 ON sub_category_2.parent_category_id = sub_category_1.category_id
 JOIN categories as sub_category_3 ON sub_category_3.parent_category_id = sub_category_2.category_id

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...