এসকিউএলআইটি: ট্যাগ এবং পণ্যগুলির একটি সমস্যা


10

আমি নিম্নলিখিতগুলি করার জন্য একটি ক্যোয়ারী তৈরির উপায় অনুসন্ধান করছি:

আসুন 3 টি সারণি বিবেচনা করুন:

  • পণ্য: পণ্য তালিকা
  • ট্যাগ: ট্যাগের তালিকা
  • ট্যাগ_টিস: কোনও পণ্যের সাথে ট্যাগ সংযুক্ত করতে ব্যবহৃত টেবিল

আসুন প্রতিটি টেবিলের জন্য এই কাঠামোটি বিবেচনা করুন:

পণ্য:

  • আইডি (int, স্বতঃআগ্রহ)
  • নাম (বর্ণের নাম, পণ্যের নাম)

ট্যাগ:

  • আইডি (স্ব-স্ব-স্বীকৃতি)
  • লেবেল (বারচর, ট্যাগের লেবেল)

Tag_ties:

  • আইডি (int, স্বতঃআগ্রহ)
  • ট্যাগ_আইডি (অন্তর্নিহিত, একটি ট্যাগ আইডির রেফারেন্স)
  • রেফ_আইডি (কোন আইডির রেফারেন্স)

আমি যা চাই:

উদাহরণস্বরূপ 10, 11 এবং 12 আইডি ট্যাগযুক্ত সমস্ত পণ্য পান।

এই কোয়েরিটি কার্যকর হয় না, কারণ এটি কমপক্ষে একটি ট্যাগ থাকা পণ্যগুলি ফিরিয়ে দেয়:

select 
    p.name as name,
    p.id as id
from 
    products p inner join tag_ties ties
on
    p.id=ties.ref_id
where
    ties.ref_id=p.id and
    ties.tag_id in (10,11,12)
group by 
    p.id
order by 
    p.name asc

উত্তর:


9

এরকম কিছু চেষ্টা করুন:

select
    t1.id,
    t1.name
from
    (
    select
        p.name as name,
        p.id as id
    from
        products p inner join tag_ties ties
    on
        p.id=ties.ref_id
    where
        ties.tag_id in (10,11,12)
    ) as t1
group by
    t1.id,
    t1.name
having
    count(t1.id) = 3
order by
    t1.name asc
;

এটি কাজ করছে :)
জুলিয়ান এল

11

ছেদ করে দেওয়া বক্তব্যগুলি ব্যবহার করে আপনি এই সমস্যার সমাধান করতে পারেন। প্রতিটি ট্যাগ_আইডের জন্য পৃথক নির্বাচন করুন এবং ছেদ করে তাদের সাথে যোগদান করুন এবং আপনি কেবল তিনটি ট্যাগ_ইডের সাথে মিল পাওয়া রেকর্ড পাবেন।

select products.id, products.name from 
products join tag_ties
on tag_ties.ref_id = products.id
where tag_ties.tag_id = 10
intersect
select products.id, products.name from 
products join tag_ties
on tag_ties.ref_id = products.id 
where tag_ties.tag_id = 11
intersect
select products.id, products.name from 
products join tag_ties
on tag_ties.ref_id = products.id 
where tag_ties.tag_id = 12

ছেদটি ব্যবহার করার বিষয়ে একটি রেফারেন্স নিবন্ধ এখানে

এই চেহারাটি আরও সুন্দর করার জন্য আপনি একটি অস্থায়ী ভিউও ব্যবহার করতে পারেন।

create temporary view temp_view as 
select name, products.id as id, tag_ties.tag_id as tag_id 
from products join tag_ties
on tag_ties.ref_id = products.id

select name, id from temp_view where tag_id = 10
intersect ...

8

নির্বাচিত উত্তর থেকে subquery প্রয়োজন হয় না। প্রদত্ত সমস্ত ট্যাগ আইডি সহ পণ্য নির্বাচন করার জন্য কোয়েরিটি সহজভাবে হতে পারে:

SELECT 
    p.*
FROM 
    products AS p
INNER JOIN
    tag_ties AS tt
ON
    tt.ref_id = p.id
AND 
    tt.tag_id IN (10, 11, 12)
GROUP BY 
    p.id
HAVING 
    COUNT(p.id)=3

এই ধারণাটি প্রসারিত করে, আমরা একক শটে ট্যাগ লেবেলের ভিত্তিতেও জিজ্ঞাসা করতে পারি। ট্যাগ সহ পণ্য নির্বাচন করতে ('foo', 'bar', 'baz'):

SELECT 
    p.*
FROM 
    products AS p
INNER JOIN
    tags AS t
ON
    t.label IN ('foo', 'bar', 'baz')
INNER JOIN
    tag_ties AS tt
ON
    tt.ref_id = p.id
AND 
    tt.tag_id = t.id
GROUP BY 
    p.id
HAVING 
    COUNT(p.id)=3

এটি কিছুটা জটিল করার জন্য, আমরা ছেদ ( AND) এবং ইউনিয়ন ( OR) মিশ্রিত করতে একটি subquery ব্যবহার করতে পারি । নীচের ক্যোয়ারী গ্রুপের সমস্ত ট্যাগ এবং গ্রুপের ('foo', 'bar')কমপক্ষে একটি ট্যাগ সহ পণ্যগুলি ফিরিয়ে দেবে ('baz', 'ding'):

SELECT 
    p.*
FROM 
    (
    SELECT 
        p.*
    FROM 
        products AS p
    INNER JOIN 
        tags AS t
    ON
        t.label IN ('foo', 'bar')
    INNER JOIN 
        tag_ties AS tt
    ON
        tt.ref_id = p.id
    AND 
        tt.tag_id = t.id
    GROUP BY 
        p.id
    HAVING 
        COUNT(p.id)=2
    ) AS p
INNER JOIN 
    tags AS t
ON 
    t.label IN ('baz', 'ding')
INNER JOIN
    tag_ties AS tt
ON
    tt.ref_id = p.id
AND 
    tt.tag_id = t.id
GROUP BY 
    p.id

2
তোমার দরকার নেই JOIN? না, প্রযুক্তিগতভাবে আপনি না কিন্তু এটি ব্যবহার না করার কোনও কারণ আছে কি? এবং এসকিউএল-89 এ অন্তর্নিহিত সংযুক্তির স্বীকৃতিতে ফিরে যাচ্ছেন?
ypercubeᵀᴹ

5
আমি ডাউনভোট করছি কারণ আপনার সর্বদা যোগদান করা উচিতstackoverflow.com/questions/5654278/… সুস্পষ্ট যোগদান না করে, আপনার কোড আমার দোকানে স্থাপন করা হবে না
gbn

3
ওহে ছেলেরা, আমাকে বলার জন্য ধন্যবাদ যে অন্তর্নিহিত যোগদানগুলি খারাপ শৈলী। আমি মূলত এটি নির্দেশ করেছিলাম যে নির্বাচিত উত্তর থেকে সাবকিউরিটি প্রয়োজনীয় ছিল না। যোগদানের উত্তরটি আমি সম্পাদনা করেছি। আপনি যদি আমার প্রশ্নগুলিতে অন্য কোনও ভুল দেখতে পান তবে দয়া করে আমাকে জানান।
মোড়গুলি

5
মন খারাপ না করে ডাউনভোট নেওয়ার জন্য +1 এবং আপনার দক্ষতার উন্নতি করার জন্য পরামর্শটি বিবেচনায় নেওয়া।
জেন

2
@ জেন কি বলেছে। +1 খুব
gbn
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.