SQL: بيان لإظهار سجل طفل واحد لكل الوالد في علاقة واحدة إلى كثير

StackOverflow https://stackoverflow.com/questions/896561

  •  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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top