سؤال

افترض أن لدي هذه الجداول ، والتي أحتاج إليها لعرض نتائج البحث في متصفح:

Table: Containers

id   |   name
1      Big Box
2      Grocery Bag
3      Envelope
4      Zip Lock


Table: Sale

id  | date     | containerid
1     20100101   1
2     20100102   2
3     20091201   3
4     20091115   4


Table: Items

id  |  name        | saleid
1      Barbie Doll   1
2      Coin          3
3      Pop-Top       4
4      Barbie Doll   2
5      Coin          4

أحتاج إلى الإخراج الذي يشبه هذا:

itemid  itemname     saleids      saledates       containerids     containertypes
1       Barbie Doll    1,2    20100101,20100102       1,2       Big Box, Grocery Bag
2       Coin           3,4    20091201,20091115       3,4       Envelope, Zip Lock
3       Pop-Top         4          20091115            4              Zip Lock

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

قد يكون هذا المثال متطرفًا بعض الشيء بسبب الوصلات 2 اللازمة للوصول إلى الحاوية من العنصر (من خلال جدول البيع).

سأكون سعيدًا لمجرد استفسار مثال يخرج هذا:

itemid  itemname     saleids      saledates    
1       Barbie Doll    1,2    20100101,20100102  
2       Coin           3,4    20091201,20091115   
3       Pop-Top         4          20091115       

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

هل كانت مفيدة؟

المحلول

على افتراض أنك تستخدم MySQL (من الأسئلة الأربعة التي لديك ، يتم وضع علامة واحد فقط على أنها MySQL) ، وظيفة group_concat هو ما أنت بعد:

  SELECT i.name AS itemname,
         GROUP_CONCAT(s.id ORDER BY s.id) AS salesids,
         GROUP_CONCAT(s.date ORDER BY s.date) AS salesdates,
         GROUP_CONCAT(s.containerid ORDER BY s.containerid) AS containerids,
         GROUP_CONCAT(c.name ORDER BY c.name) AS containertypes
    FROM ITEMS i
    JOIN SALE s ON s.id = i.salesid
    JOIN CONTAINERS c ON c.id = s.containerid
GROUP BY i.name

إذا كنت تريد العناصر التي قد لا تحتوي على روابط لجداول المبيعات و/أو الحاويات - أضف "اليسار" أمام "Join".

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