استرجاع السجلات التي على حد سواء العلامة T1 و T2

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

  •  03-07-2019
  •  | 
  •  

سؤال

وأحتاج استعلام SQL التي سيتم استرداد كافة العناصر التي لديها كل العلامات، وليس أي من العلامات. لدي بالفعل استعلام لكن إرجاع كافة العناصر التي هوف كل من العلامات، وليس النتيجة المتوقعة. البحث صفا مفصلا أدناه. شكرا!

وهيكل الجدول:

ITEMS TABLE
------------
item_id
item_name

TAGS TABLE
----------
tag_id
tag_name

ITEMTAGS TABLE
---------------
tag_id
item_id

والاستعلام:

SELECT Items.* FROM Items 
INNER JOIN ItemTags ON Items.item_id = ItemTags.item_id
WHERE ItemTags.tag_id IN (T1, T2)
GROUP BY Items.item_id

والنتيجة: جميع البنود التي لديها T1 أو T2

والنتيجة المتوقعة: جميع البنود التي لديها كل T1 و T2

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

المحلول

select i.*
from items i, itemtags it1, itemtags it2
where i.item_id=it1.item_id and it1.tag_id=T1
and i.item_id=it2.item_id and it2.tag_id=T2;

نصائح أخرى

إذا تدعم قاعدة البيانات الخاصة بك الكلمة تتقاطع (SQLSERVER لا) يمكن أن تكتب:

SELECT Items.* 
FROM Items 
WHERE Items.item_id in 
/* intersection between items that have the tag T1 
   and the ones that have the tag T2 */ 
(
    SELECT item_id FROM ItemTags WHERE tag_id = T1
    INTERSECT 
    SELECT item_id FROM ItemTags WHERE tag_id = T2
)

إذا لم يكن كذلك، سوف تحتاج إلى القيام بشيء ما مثل:

SELECT Items.* 
FROM Items 
WHERE Items.item_id in 
(
    SELECT ItemTags1.item_id 
    FROM ItemTags as ItemTags1 
        INNER JOIN ItemTags as ItemTags2 
        ON ItemTags1.item_id = ItemTags2.item_id 
    WHERE 
            ItemTags1.tag_id = T1
        AND ItemTags2.tag_id = T2
)

في الاستعلام الثاني رعاية مشاكل الأداء المحتملة بسبب ItemTags1.item_id = ItemTags2.item_id. سوف تحتاج فهرس على المفتاح الخارجي للعمل بشكل جيد.

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