مسمة فرعية مع نتائج متعددة مجتمعة في حقل واحد؟
-
27-09-2019 - |
سؤال
افترض أن لدي هذه الجداول ، والتي أحتاج إليها لعرض نتائج البحث في متصفح:
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".