Ahmed Ebrahim11 نشر منذ 18 ساعة أرسل تقرير نشر منذ 18 ساعة السلام عليكم اريد ان اسال ما الفرق بين ال queries التاليه select product_id,year as first_year, quantity, price from Sales where(product_id, year) in (select product_id, min(year) from Sales group by product_id) // تخرج حلا مختلف select product_id,min(year) as first_year, quantity, price from Sales اري انه لا فرق 2 اقتباس
0 ياسر مسكين نشر منذ 7 ساعة أرسل تقرير نشر منذ 7 ساعة الفرق بين الاستعلامين هو في طريقة اختيار السجلات التي يتم عرضها، وسبب الاختلاف في النتائج هو كيفية تعامل كل استعلام مع الأعمدة "quantity" و"price" ففي الاستعلام الأول: select product_id, year as first_year, quantity, price from Sales where (product_id, year) in ( select product_id, min(year) from Sales group by product_id ); يتم تحديد السجلات التي تحمل أقل سنة (min(year)) لكل منتج (product_id) الشرط (product_id, year) يضمن أن الصف المحدد هو الذي يحتوي على أقل قيمة للسنة بعدها يتم الاحتفاظ بالأعمدة quantity و price كما هي موجودة في الصف الموافق لأقل سنة. بينما الاستعلام الثاني: select product_id, min(year) as first_year, quantity, price from Sales group by product_id; يستخدم group by لتجميع الصفوف حسب product_id بحيث يتم إرجاع أقل سنة (min(year)) لكل منتج، لكن لا يمكن ل SQL هنا معرفة أي قيمة من quantity أو price تختارها لأنهما لا يشتركان في قاعدة التجميع. لذلك إذا أردت التأكد من أن القيم الخاصة بـ quantity و price صحيحة، استمر باستخدام الاستعلام الأول، لأنه يربط القيم بالسجل الصحيح أما إذا كنت تريد العمل فقط مع السنة الدنيا دون الحاجة للتأكد من ارتباط الأعمدة الأخرى بالسنة، يمكنك استخدام الاستعلام الثاني. 1 اقتباس
0 Chihab Hedidi نشر منذ 17 ساعة أرسل تقرير نشر منذ 17 ساعة على الرغم من أن الجملتين قد تبدوان متشابهتين، إلا أنهما تنتجان نتائج مختلفة بسبب كيفية التعامل مع الأعمدة الإضافية بجانب الأعمدة المحسوبة، حيث في الإستعلام الأول يتم تحديد أول سنة لكل منتج باستخدام الاستعلام الداخلي، و يتم بعد ذلك مطابقة السجل بالكامل بناء على product_id, year مع النتيجة المحسوبة من الاستعلام الداخلي، و هذا يعني أنه يتم تحديد سجل واحد فقط لكل منتج يتوافق مع أصغر سنة و النتيجة تكون كل منتج سيظهر مرة واحدة مع بيانات quantity وprice التي تتوافق مع السنة الأولى. أما في الكود الثاني هنا يتم استخدام group by مع product_id، و يتم حساب أصغر سنة لكل منتج، ولكن الأعمدة الأخرى ليست ضمن الدالة التجميعية أو في عبارة group by، و في معظم قواعد البيانات، ستقوم قاعدة البيانات باختيار قيمة عشوائية أو غير محددة من الأعمدة الإضافية quantity وprice للسجلات المتعلقة بكل مجموعة. 1 اقتباس
0 محمد عاطف17 نشر منذ 4 ساعة أرسل تقرير نشر منذ 4 ساعة وعليكم السلام ورحمة الله وبركاته. أولا الفرق الرئيسي أن الإستعلام الأول : select product_id,year as first_year, quantity, price from Sales where(product_id, year) in (select product_id, min(year) from Sales group by product_id) سيقوم بإعادة القيم جميعها وليس قيمة واحدة فلو كان هناك منتج له نفس product_id وقد تم بيعه أكثر من مرة في نفس السنة التي لها قيمة min(year) فهنا هذا الإستعلام سيأتي بجميع تلك السجلات مع القيم الصحيحة الخاصة بها من quantity و price . أما الإستعلام الثاني : select product_id,min(year) as first_year, quantity, price from Sales لاحظ هنا أنك لم تضع group by وهذا خاطئ حيث محركات قواعد البيانات إذا لم يتم وضع جملة group by وتم إستخدام دوال التجميع aggregations مثل min هنا فكل محرك قواعد بيانات سيتعامل بعشوائية . أى هناك محركات بحث ستأتي بال product_id و ستأتي بأقل قيمة في الجدول كله لل year اي أنه سيتم عرض منتج واحد عشوائي مع أقل سنة في الجدول . وهنا سيتم إعادة سجل واحد فقط لمنتج واحد . والصحيح هو وضع group by هكذا : select product_id, min(year) as first_year, quantity, price from Sales group by product_id; هنا الإستعلام هذا سيعمل نفس طريقة عمل الإستعلام الأول إذا كان هناك سجل واحد فقط لكل منتج في السنة الأقل . ولكن إذا كان هناك أكثر من سجل للمنتج أى تم بيعه أكثر من مرة في نفس العام فهنا سيتم إحضار سجل واحد فقط للمنتج و قيمة quantity و price لن يكونا صحيحين حيث سيتم إحضارهم بعشوائية لأن محرك قاعدة البيانات قام بتجميع الصفوف بناء على product_id وإذا كانت الحقول متشابهة فهذا سيجد سيعيد حقل واحد أما إذا كانت مختلفة مثل quantity و price فهنا لن يعرف كيف سيتعامل معهم وسيعيد قيمة عشوائية من القيم . ويمكنك إستخدام الدالة GROUP_CONCAT لدمج تلك القيم وستعمل مثل الإستعلام الأول ولكن سيتم إعادة القيم في حقل واحد فقط : SELECT product_id, MIN(year) AS first_year, GROUP_CONCAT(quantity) AS quantity, GROUP_CONCAT(price) AS price FROM Sales GROUP BY product_id; وهنا سيتم إعادة نتيجة كالتالي : product_id | year | quantities | prices 1 | 2008 | 10, 15 | 50, 55 2 | 2008 | 20, 30 | 100, 110 اقتباس
السؤال
Ahmed Ebrahim11
السلام عليكم
اريد ان اسال ما الفرق بين ال queries التاليه
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.