2011-10-15 10 views
18

मेरे मूल प्रश्न कर रहा है शामिल हों बजाय कहां खंड का उपयोग कर मिलती है। मुझे एहसास हुआ कि यह उन फिल्मों को वापस नहीं कर रहा था जिनके पास कोई सितार या शैलियों का प्रदर्शन नहीं हुआ था, इसलिए मुझे लगता है कि मुझे हर फिल्म को दिखाने के लिए एक बाएं जॉइन करना है। यहां मेरा मूल एसक्यूएल है:MySQL वाम के साथ उपनाम का उपयोग कैसे करें शामिल हों

SELECT * 
FROM movies m, stars s, stars_in_movies sm, genres g, genres_in_movies gm 
WHERE m.id = sm.movie_id 
AND sm.star_id = s.id 
AND gm.genre_id = g.id 
AND gm.movie_id = m.id 
AND m.title LIKE '%the%' 
AND s.first_name LIKE '%Ben%' 
ORDER BY m.title ASC 
LIMIT 5; 

मैंने फिल्मों पर एक बाएं जॉइन करने की कोशिश की, मैं निश्चित रूप से कुछ गलत कर रहा हूं।

SELECT * 
FROM movies m, stars s, stars_in_movies sm, genres g, genres_in_movies gm 
LEFT JOIN movies m1 ON m1.id = sm.movie_id 
LEFT JOIN movies m2 ON m2.id = gm.movie_id 
AND sm.star_id = s.id 
AND gm.genre_id = g.id 
ORDER BY m.title ASC 
LIMIT 5; 

मैं ERROR 1054 (42S22): Unknown column 'sm.movie_id' in 'on clause' इतनी स्पष्ट रूप से मैं गलत कर रहा हूँ में शामिल होने के लिए, मैं सिर्फ नहीं दिख रहा है कि यह क्या है।

+1

गाहा। उचित रूप से निर्दिष्ट जॉइन के साथ आलसी 'टेबल, टेबल, टेबल' से आलसी मिश्रण को अल्ट्रा-बदसूरत है। –

उत्तर

11

JOIN साथ अल्पविराम ऑपरेटर मिश्रण मत करो - वे विभिन्न पूर्वता है! manual में इस बारे में भी एक चेतावनी है:

हालांकि, अल्पविराम ऑपरेटर की पूर्वता की अंदरूनी शामिल हों तुलना में कम है, पार, शामिल हों वाम शामिल हों, और इतने पर। यदि आप शामिल होने की स्थिति में अन्य शामिल प्रकारों के साथ अल्पविराम जोड़ते हैं, तो Unknown column 'col_name' in 'on clause' फ़ॉर्म की त्रुटि हो सकती है। इस समस्या से निपटने के बारे में जानकारी बाद में इस खंड में दी गई है।

ऐसा करें:

SELECT * 
FROM movies m 
LEFT JOIN (
    stars s 
    JOIN stars_in_movies sm 
     ON sm.star_id = s.id 
) ON m.id = sm.movie_id AND s.first_name LIKE '%Ben%' 
LEFT JOIN (
    genres g 
    JOIN genres_in_movies gm 
     ON gm.genre_id = g.id 
) ON gm.movie_id = m.id 
WHERE m.title LIKE '%the%' 
ORDER BY m.title ASC 
LIMIT 5; 
+0

मुझे लगता है कि लाइन 'और m.title LIKE '%%'' होना चाहिए 'जहां' m'itle LIKE '%%' 'होना चाहिए, है ना? – styfle

+0

हाँ, क्षमा करें! 'AND' होने से गलत परिणाम मिलेगा। –

+0

क्या यह दूसरे के लिए कहां होना चाहिए?उदाहरण के लिए यदि मैं पहला नाम और अंतिम नाम करना चाहता हूं: 'JOIN stars_in_movies sm sm.star_id = s.id पर sm.seirst_name LIKE'% Ben% 'और s.last_name जैसे'% Stiller% '' – styfle

3

आप खंड पर एक ही में अपनी मिलती से संबंधित अपनी शर्तों रखना चाहिए। हालांकि, अपने ऊपर समस्या के लिए, आप निम्न क्वेरी का उपयोग करना चाहिए:

SELECT * 
FROM movies m 
LEFT JOIN stars_in_movies sm ON sm.movie_id = m.id 
JOIN stars s ON sm.star_id = s.id 
LEFT JOIN genres_in_movies gm ON gm.movie_id = m.id 
JOIN genres g ON gm.genre_id = g.id 
ORDER BY m.title ASC 
LIMIT 5; 
1

हो सकता है कि बदसूरत, लेकिन जिस तरह से यह काम करेंगे यहाँ है। खबरदार इस बदसूरत है और लोगों की बहुत का उपयोग करते समय मिलती है हैक्स

SELECT * 
FROM movies m, stars_in_movies sm LEFT JOIN movies m1 ON m1.id = sm.movie_id, stars s 
ORDER BY m.title ASC 
LIMIT 5; 

इस तरह के बारे में चेतावनी दे रहा है, तो आप सही तालिका जो कॉलम आप तुलना कर रहे हैं के साथ शामिल होने के करना चाहिए।

0

एसक्यूएल (भीतरी MySQL में शामिल होने) से जुड़ें

select emp1.id,emp1.name,emp1.job from (select id, type as name, description as job from component_type as emp1)emp1 
inner join 
emp 
on emp1.id=emp.id; 

वाम

select emp1.id,emp1.name,emp1.job from (select id, type as name, description as job from component_type as emp1 where id between '1' AND '5')emp1 
left join 
emp 
on emp1.id=emp.id; 

जुड़ें अधिकार में शामिल होने का उपयोग किए बिना

select emp1.id,emp1.name,emp1.job from (select id, type as name, description as job from component_type as emp1)emp1 
Right join 
(select * from emp where id between '1' and '5')exe 
on emp1.id=exe.id; 
+0

सभी उदाहरण उपनाम नाम पर आधारित हैं और तालिका में अलग-अलग स्तंभ नाम हैं लेकिन डेटा समान गुण हैं .. –

0

उर्फ ​​का प्रयोग कई तालिका कनेक्ट शामिल हों ..

चयन राशि (s.salary_amount) total_expenses_paid_to_all_department रूप

salary_mas_tbl रों से

, dept_mas_tbl घ

जहां s.salary_dept = d.dept_id;

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