2013-08-09 4 views
9

कैसे लिखूं मैं SQL के लिए बहुत नया हूं और मुझे इस SQL ​​क्वेरी को लिखने में कुछ मदद चाहिए।MySQL - मैं इस क्वेरी

मैं इस तरह एक फिल्म तालिका है:

Movie_id Actor_name Director_name 
1   a    AA 
1   b    AA 
2   b    BB 
2   d    BB 

अब मैं अभिनेताओं और निर्देशकों जो एक दूसरे के साथ काम नहीं किया के सभी जोड़े बाहर प्रिंट करना चाहते हैं - इस मामले इसे प्रिंट होगा में उदाहरण के लिए (एक, बी बी) और (घ, एए)

उत्तर

2

आप इस तरह यह कर सकते हैं:

SELECT a.Actor_name, d.Director_name 
FROM (
    (SELECT DISTINCT Actor_name from movie) a 
    CROSS JOIN 
    (SELECT DISTINCT Director_name from movie) d 
) WHERE NOT EXISTS (
    SELECT * FROM movie m 
    WHERE m.Actor_name=a.Actor_name 
    AND m.Director_name=d.Director_name 
) 

विचार अभिनेताओं और निर्देशकों (कार्तीय उत्पाद के सभी संभव जोड़े का उत्पादन होता है के बीच में शामिल होने के प्रश्न), टी एक फिल्म के माध्यम से जोड़े गए जोड़े को बाहर करने के लिए हेन फ़िल्टर करें (NOT EXISTS हालत)।

यहाँ एक demo on sqlfiddle.

1

मैं पहली बार शामिल होने के एक क्रॉस के साथ अभिनेताओं और निर्देशकों के सभी जोड़े को विकसित करने (अर्थात Cartesian product) कर ऐसा करते हैं होता है, और उसके बाद मनाया संबंधों के तालिका का उपयोग कर इस सूची को फ़िल्टर करें।

SELECT * 
FROM (
    -- cross join 
    SELECT a.actor_name, d.director_name 
    FROM (SELECT DISTINCT actor_name FROM movies) a 
    ,(SELECT DISTINCT director_name FROM movies) d 
    ) pairs 
WHERE NOT EXISTS (
    SELECT 1 FROM movies m 
    WHERE pairs.actor_name = m.actor_name 
    AND pairs.director_name = m.director_name 
    ) 

SQLFiddle Demo (स्कीमा मूल रूप से dasblinkenlight की बेला द्वारा खा के बाद से वह मुझे यह करने के लिए हरा)।

1

एक वैकल्पिक:

select distinct t1.actor_name, t2.director_name from t t1, t t2 
where (t1.actor_name, t2.director_name) not in (
    select actor_name, director_name from t) 

फिडल here

एक अन्य विकल्प:

select distinct t1.actor_name, t2.director_name from t t1 
cross join t t2 left join t t3 
on t1.actor_name = t3.actor_name and t2.director_name = t3.director_name 
where t3.actor_name is null 

फिडल here

+1

आपका पहले एक सरल एक है। मुझें यह पसंद है :) – Franco

0

इसके अलावा कार्तीय उत्पाद में आधारित (पिछले प्रतिक्रियाओं के साथ कुछ मतभेद के साथ):

select distinct m.Actor_name, mo.Director_name 
from movie m 
cross join movie mo 
where (not exists (select mv.Actor_name, mv.Director_name 
        from movie mv 
        where (mv.Actor_name = m.Actor_name and mv.Director_name = mo.Director_name))) 

Fiddle

संबंधित मुद्दे