سؤال

وبالنظر إلى المخطط للعلامات تنفيذ

وITEM ItemId، ItemContent

وTAG TagId، اسم العلامة

وITEM_TAG ItemId، TagId

ما هو أفضل وسيلة للحد من عدد من العناصر للعودة عند اختيار مع به؟

SELECT i.ItemContent, t.TagName FROM item i 
INNER JOIN ItemTag it ON i.id = it.ItemId 
INNER JOIN tag t ON t.id = it.TagId 

وهو بالطبع أسهل طريقة للحصول عليها كل مرة، ولكن باستخدام شرط الحد ينهار، لتحصل على نسختين من كل العناصر لكل بطاقة، التي تعتبر تجاه عدد الصفوف في LIMIT.

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

المحلول

وبلدي الحل الثاني يستخدم وظيفة GROUP_CONCAT الخلية () لتجمع بين كافة العلامات مطابقة بند إلى سلسلة مفصولة بفواصل في مجموعة النتائج.

SELECT i.ItemContent, GROUP_CONCAT(t.TagName ORDER BY t.TagName) AS TagList
FROM item AS i 
  INNER JOIN ItemTag AS it ON i.id = it.ItemId 
  INNER JOIN tag AS t ON t.id = it.TagId
GROUP BY i.ItemId;

وظيفة GROUP_CONCAT () هي ميزة الخلية، انها ليست جزءا من SQL القياسية.

نصائح أخرى

وربما شيء من هذا القبيل

select i.ItemContent, t.TagName from (SELECT ItemId, ItemContent FROM item limit 10) i
INNER JOIN ItemTag it ON i.ItemId = it.ItemId --You will miss tagless items here!
INNER JOIN tag t ON t.id = it.TagId

وبلدي الاقتراح الأول هو استخدام فرعي لتوليد قائمة العنصر ID والعودة البنود مطابقة تلك بند البائع. ولكن هذا لا يشمل اسم العلامة في مجموعة النتائج الخاصة بك. سوف يقدم إجابة منفصلة مع حل آخر.

SELECT i.ItemContent
FROM item AS i
WHERE i.id IN (
  SELECT it.ItemId
  FROM ItemTag AS it
    INNER JOIN tag AS t ON (t.id = it.TagId)
  WHERE t.TagName IN ('mysql', 'database', 'tags', 'tagging')
);

وهذا هو فرعي غير مترابطة، ولذلك فإن محرك SQL جيد يجب أن تكون عاملا بها وتشغيله مرة واحدة فقط.

ويمكنك أيضا استخدام متميزة / المجموعة حسب:

و SELECT DISTINCT TagID, TagName FROM ((TAG T INNER JOIN ITEM_TAG I_T ON T.TagID = I_T.TagID) INNER JOIN ITEM I ON I_T.ItemID = I.ItemID) GROUP BY TagID, TagName

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