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

السؤال

نشر

هناك سؤال لا أستطيع حله. يقول:

جد كل اسماء كل الأفلام التي مثل فيها كلن من (Jennifer Lawrence) و (Bradley Cooper) معا.

(جربت رفع قاعدة البيانات لكن حجمها كبير نسبيا بالنسبة لسرعة الأنترنت في مصر فبدلا من قاعدة البيانات بأكملها سأرسل ال schema للقاعدة.)

CREATE TABLE directors (
    movie_id INTEGER NOT NULL,
    person_id INTEGER NOT NULL,
    FOREIGN KEY(movie_id) REFERENCES movies(id),
    FOREIGN KEY(person_id) REFERENCES people(id)
);
CREATE TABLE movies (
    id INTEGER,
    title TEXT NOT NULL,
    year NUMERIC,
    PRIMARY KEY(id)
);
CREATE TABLE people (
    id INTEGER,
    name TEXT NOT NULL,
    birth NUMERIC,
    PRIMARY KEY(id)
);
CREATE TABLE ratings (
    movie_id INTEGER NOT NULL UNIQUE,
    rating REAL NOT NULL,
    votes INTEGER NOT NULL,
    FOREIGN KEY(movie_id) REFERENCES movies(id)
);
CREATE TABLE stars (
    movie_id INTEGER NOT NULL,
    person_id INTEGER NOT NULL,
    FOREIGN KEY(movie_id) REFERENCES movies(id),
    FOREIGN KEY(person_id) REFERENCES people(id)
);

حللت هذه المسئلة من قبل لكن حتى عندما عدت للحل لم افهمه. هذا هو الحل:

SELECT movies.title FROM stars JOIN people ON people.id = stars.person_id JOIN movies ON stars.movie_id = movies.id WHERE people.name IN ('Bradley Cooper', 'Jennifer Lawrence') GROUP BY stars.movie_id HAVING COUNT(stars.person_id) = 2;

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

Recommended Posts

  • 0
نشر

محرك قواعد البيانات لا يقرأ الكود من البداية أي من SELECT بل ينفذه بترتيب منطقي مختلف، والحل يعتمد على حيلة رياضية للتأكد من وجود الممثلين معًا، في البداية جمع البيانات المتفرقة، ولدينا أسماء الممثلين في جدول people، وأسماء الأفلام في جدول movies، والجدول الذي يربط بينهم هو stars.

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

ثم مرحلة التصفية الأولية من خلال where:

WHERE people.name IN ('Bradley Cooper', 'Jennifer Lawrence')

بحيث تطلب من قاعدة البيانات حذف كل الممثلين الآخرين من الجدول السابق، والاحتفاظ فقط بالصفوف التي يظهر فيها إما Bradley Cooper أو Jennifer Lawrence.

ثم التجميع:

GROUP BY stars.movie_id

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

ثم الشرط النهائي بواسطة HAVING:

HAVING COUNT(stars.person_id) = 2

للتبسيط تسأل قاعدة البيانات عن البحث في الصناديق التي جمعتها، لتوفر فقط الصندوق الذي يحتوي على ممثلين اثنين.

بما أننا في الخطوة الثانية WHERE قمنا بتصفية الجميع باستثناء برادلي وجينيفر، فلو الفيلم يحتوي على شخصين، فيعني رياضيًا أن هذين الشخصين هما برادلي وجينيفر معًا، أما إن كان الصندوق يحتوي على شخص واحد COUNT = 1، بالتالي أحدهما فقط ممثل في الفيلم، فنقوم بتجاهله.

ثم نحصل على النتيجة:

SELECT movies.title

من الصناديق التي اجتازت شرط الـ HAVING، قم بطباعة اسم الفيلم فقط.

بتاريخ 22 ساعة قال Abdelrehman Elsied:

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

البرمجة ليست اختبارًا للذاكرة، بل هي طريقة لحل المشكلات، أي ليست وظيفتك تذكر كل شئ، الحفظ والاستيعاب مهمان في البداية لكن بعد ذلك تستطيع البحث عن الأمور التي تريد تذكرها، ولا تنظر للكود ككتلة واحدة قسمه إلى أجزاء صغيرة كما فعلت في شرح الـ SQL بالأعلى، واختبر كل جزء بمفرده لترى ماذا يفعل، ومع الوقت ستكتسب خبرة ويصبح الأمر أسهل، وستتمكن من البحث أو السؤال عن السبب أو الحلول بشكل أفضل.

ستجد تفصيل هنا:

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...