SQL: بيان لإظهار سجل طفل واحد لكل الوالد في علاقة واحدة إلى كثير
-
23-08-2019 - |
سؤال
لدي 2 طاولات، طاولة منتج وطاولة للصور. يمكن أن تحتوي المنتجات على أكثر من 1 صورة لكل سجل. أحتاج إلى عبارة SQL التي ستقوم بإدراج صورة واحدة لكل منتج بدلا من جميع الصور لكل منتج.
مثال أسفل جهدي الحالي هو:
SELECT Product.RefCode, Img.ImgPath
FROM Product INNER JOIN (
SELECT ProductImg.ImgPath, ProductImg.PrdFK
FROM ProductImg
LIMIT 0,1) AS Img ON Product.PrdID = Img.PrdFK;
يعيد المثال أعلاه نتائج 0 النتائج، ومع ذلك، إذا قمت بإزالة الحد الأقصى 0،1 من SUB SELECT، أحصل على قائمة كاملة بجميع المنتجات وجميع الصور.
أريد فقط أن يتم إرجاع سجل صورة واحدة لكل سجل المنتج.
لقد قمت بمراجعة رمز "مبرمج" إلى MySQL ويعمل بشكل جيد.
SELECT Product.RefCode,
(Select ProductImg.ImgPath
From ProductImg
Where Product.PrdID = Img.PrdFK LIMIT 0,1) AS ImgPath
FROM Products
لسبب ما عند محاولة حل "Bill Karwin's"، أرسلت تحميل الخادم لفترة طويلة.
المحلول
هذا يجب أن يعمل:
SELECT Product.RefCode,
(Select Img.ImgPath
From ProductImg
Where Product.PrdID = Img.PrdFK LIMIT 0,1) As ImgPath
FROM Product
إذا كان لديك وسيلة لتحديد الصورة التي يجب أن تعود المحدد، فيمكنك إضافة أي مكان وربما يكون طلبا في الاختيار الفرعي.
في المثال التالي، سنحصل على أحدث الصور النشطة فقط.
SELECT Product.RefCode,
(Select Img.ImgPath
From ProductImg
Where Product.PrdID = Img.PrdFK
And IsActive = 1
Order By EntryDate Desc LIMIT 0,1) As ImgPath
FROM Product
تحرير وتصحيح "أعلى 1" إلى "الحد 0،1".
نصائح أخرى
MySQL لديه بعض المرونة هنا. يمكنك استخدام المجموعة من خلال تقييد النتيجة إلى صف واحد لكل منتج، ثم ستختار MySQL الصورة التي تعسفا. في الممارسة العملية، يميل إلى أن تكون الصورة التي يتم تخزينها جسديا أولا في قاعدة البيانات، ولكن ليس لديك أي سيطرة على ذلك.
SELECT p.RefCode, i.ImgPath
FROM Product p INNER JOIN ProductImg i
ON (p.PrdID = i.PrdFK)
GROUP BY p.PrdID;
إذا كنت تريد 1 محدد صورة لكل منتج، هناك طرق للقيام بذلك أيضا. تحتاج إلى تضمين ذلك في متطلباتك. :-)
إذا كان لديك عمود معرف على جدول الصور، فينبغي أن يعمل هذا (بغض النظر عن منتج أو إصدار SQL) -
SELECT p.RefCode, i1.ImgPath FROM Product p INNER JOIN ProductImg i1 ON p.PrdId = i1.PrdFk LEFT JOIN ProductImg i2 ON i1.PrdId = i2.PrdId AND i1.ImgId < i2.ImgId WHERE i2.ImgId IS NULL
ما تحتاجه هو العلم على جدول الصور لتحديد ما إذا كانت الصورة الرئيسية التي سيتم عرضها. هناك طرق لسحب صورة تعسفية، لكنني أعتقد أنه سيكون من الأفضل التأكد من سحب الصورة الصحيحة.