2010-07-08 14 views
9

मुझे user तालिका और complaint तालिका मिली है।अलग-अलग कॉलम पर दो बार एक ही टेबल में शामिल होने से

[opened_by] [complaint_text] [closed_by] 
(user_id)   (text)   (user_id) 
(user_id)   (text)   (user_id) 
(user_id)   (text)   (user_id) 

सभी उपयोगकर्ता, यानी complainers और शिकायत-रिसोल्वर तालिका user में स्थित हैं:

complaint तालिका में निम्नलिखित संरचना है।

दोनों कॉलम के लिए उपयोगकर्ता नाम दिखाने के लिए मैं एक प्रश्न कैसे लिखूं?

यह मैं एक देता है:

SELECT user.username, complaint.complaint_text 
FROM complaint 
LEFT JOIN user ON user.user_id=complaint.opened_by 

लेकिन मैं यह इसलिए दोनों _by कॉलम आईडी बजाय उपयोगकर्ता नाम दिखाने लिखने के लिए कैसे पता नहीं है।

उत्तर

31
SELECT 
    complaint.complaint_text, 
    A.username, 
    B.username 
FROM 
    complaint 
    LEFT JOIN user A ON A.user_id=complaint.opened_by 
    LEFT JOIN user B ON B.user_id=complaint.closed_by 
+0

मैं जहां संभव हो, आसानी से पठनीय और कुशल उप-प्रश्नों को प्राथमिकता देता हूं। –

+0

क्या यह 'शिकायत' एक्स' ए' एक्स 'बी' के कार्टेशियन उत्पाद प्रदान नहीं करेगा? – NeverEndingQueue

+0

@NeverEndingQueue - नहीं, ऐसा नहीं होगा क्योंकि प्रत्येक जॉइन की स्थिति है – potatopeelings

0
SELECT user1.username AS opened_by_username, complaint.complaint_text, user2.username AS closed_by_username 
FROM user AS user1, complaint, user as user2 
WHERE user1.user_id = complaint.opened_by 
AND user2.user_id = complaint.closed_by 

फिर से एक उपनाम का उपयोग कर इसे शामिल हों (thats क्या user2 सामान के रूप में उपयोगकर्ता के बारे में है) इस क्वेरी

0

उपयोग:

SELECT opener.username as opened_by, complaint.complaint_text, closer.username as closed_by 
FROM complaint 
LEFT JOIN user as opener ON opener.user_id=complaint.opened_by 
LEFT JOIN user as closer ON closer.user_id=complaint.closed_by 
1

मैं उप प्रश्नों पसंद करते हैं के रूप में मुझे लगता है उन्हें समझना आसान है ...

SELECT (SELECT name 
      FROM user 
      WHERE user_id = opened_by) AS opener, 
     (SELECT name 
      FROM user 
      WHERE user_id = closed_by) AS closer, 
     complaint_text 
    FROM complaint; 

यदि आपके पास कोई प्रदर्शन चिंता है, तो आमतौर पर क्वेरी ऑप्टिमाइज़र द्वारा उप-प्रश्नों को फिर से लिखा जाता है।

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