2009-09-12 13 views
5

मेरे पास एक प्रोजेक्ट टेबल है जिसमें उपयोगकर्ताओं के लिए दो विदेशी कुंजी हैं (user_id और winner_user_id), एक परियोजना के मालिक के लिए और एक परियोजना के विजेता के लिए।एसक्यूएल, तालिका में एकाधिक विदेशी कुंजी के साथ कैसे पूछें?

+----------------+-------------------------+------+-----+---------+----------------+ 
| Field   | Type     | Null | Key | Default | Extra   | 
+----------------+-------------------------+------+-----+---------+----------------+ 
| project_id  | int(10) unsigned  | NO | PRI | NULL | auto_increment | 
| start_time  | datetime    | NO |  | NULL |    | 
| end_time  | datetime    | NO |  | NULL |    | 
| title   | varchar(60)    | NO |  | NULL |    | 
| description | varchar(1000)   | NO |  | NULL |    | 
| user_id  | int(11)     | NO |  | NULL |    | 
| winner_user_id | int(10) unsigned  | YES |  | NULL |    | 
| type   | enum('fixed','auction') | YES |  | NULL |    | 
| budget   | decimal(10,0)   | YES |  | NULL |    | 
+----------------+-------------------------+------+-----+---------+----------------+ 

अब मैं परियोजनाओं और दोनों उपयोगकर्ताओं के बारे में डेटा प्राप्त करने के लिए एक ही प्रश्न में कोशिश कर रहा हूं।

तो मैं जैसे

SELECT projects.project_id, projects.title, projects.start_time, 
      projects.description, projects.user_id, projects.winner_user_id, 
      users.username as owner, users.username as winner 
     FROM projects,users 
     WHERE projects.user_id=users.user_id 
     AND projects.winner_user_id=users.user_id 

कौन सा स्पष्ट रूप से एक खाली सेट देता है एक प्रश्न तैयार की। असली समस्या यह है कि मैं इन अलग-अलग user_ids को कैसे संदर्भित करूं। मैंने एएस कीवर्ड का उपयोग करने की कोशिश की और फिर उसी नाम का उपयोग करके मैंने उसी एसक्यूएल क्वेरी में बनाया था लेकिन स्पष्ट रूप से यह काम नहीं करता है।

मैं

+------------+-------------------------------------------------+---------------------+---------+----------------+--------------+--------------+ 
| project_id | title           | start_time   | user_id | winner_user_id | owner  | winner  | 
+------------+-------------------------------------------------+---------------------+---------+----------------+--------------+--------------+ 
|   1 | CSS HTML Tableless expert for site redesign  | 2009-09-01 21:07:26 |  1 |    3 | mr X  | mr Y  | 
|   2 | High Quality Ecommerce 3-Page Design HTML & CSS | 2009-09-01 21:10:04 |  1 |    0 | mr X  | mr Z  | 

की तरह कुछ करना चाहते हैं मैं इस संभाल करने के लिए एक प्रश्न कैसे निर्माण कर सकते हैं बातें अंत में स्पष्ट करने के लिए?

अग्रिम धन्यवाद।

उत्तर

8

आप करीब हैं, लेकिन आपको मालिक पर एक बार और विजेता पर दो बार उपयोगकर्ता तालिका में शामिल होने की आवश्यकता है। दोनों को अलग करने के लिए एक टेबल उपनाम का प्रयोग करें।

SELECT 
     projects.project_id 
    , projects.title 
    , projects.start_time 
    , projects.description 
    , projects.user_id 
    , projects.winner_user_id 
    , users.username as owner 
    , winnerUser.username as winner 
FROM projects 
INNER 
    JOIN users 
    ON projects.user_id=users.user_id 
INNER 
    JOIN users winnerUser 
    ON projects.winner_user_id=winnerUser.user_id 
+0

बहुत बहुत धन्यवाद! मैं वास्तव में कभी भी INNER जॉइन सिंटैक्स का उपयोग नहीं करता लेकिन मुझे यह दिलचस्प लगता है कि विजेता उपयोगकर्ता को सीधे बाद में निर्दिष्ट नहीं किया गया है। – zenna

2
SELECT ... FROM users AS winers, users AS owners 
WHERE projects.user_id=owners.user_id 
     AND projects.winner_user_id=winners.user_id 
1

कुछ इस तरह का उपयोग कर के बारे में क्या:

SELECT projects.project_id, projects.title, projects.start_time, 
    projects.description, projects.user_id, projects.winner_user_id, 
    user_owner.username as owner, user_winner.username as winner 
FROM projects 
    inner join users user_owner on user_owner.user_id = projects.user_id 
    inner join users user_winner on user_winner.user_id = projects.winner_user_id 

आप पहली परियोजना है, तो आप भीतरी मालिक पर शामिल होने के (एक विशिष्ट उपनाम का उपयोग), और फिर आंतरिक में शामिल होने के विजेता (अन्य विशिष्ट उपनाम का उपयोग करके) पर।

और, चयनित खंड में, आप उन उपनामों का उपयोग अपनी इच्छित जानकारी प्राप्त करने के लिए करते हैं - वैसे ही यदि आपको किसी भी खंड में बीटीडब्ल्यू को प्रतिबंधित करने की आवश्यकता होती है।

नोट: यदि आप उन परियोजनाओं को भी चाहते हैं जिनके पास अभी तक विजेता नहीं है, तो आप आंतरिक के बजाय बाएं शामिल होने का उपयोग करना चाहेंगे।

0
SELECT u1.user_id AS user_id, u2.user_id AS AS winner_id 
FROM projects p 
    INNER JOIN users u1 ON p.user_id=u1.user_id 
    INNER JOIN users u2 ON p.winner_user_id=u2.user_id 
0

यह काम करना चाहिए, और शून्य वापसी अगर अज्ञात में विजेता (जब winner_user_id रिक्त है)

SELECT projects.project_id, 
    projects.title, 
    projects.start_time, 
    projects.description, 
    projects.user_id, 
    projects.winner_user_id, 
users_owner.username as owner, 
users_winner.username as winner 
FROM projects 
    INNER JOIN users AS users_owner ON users_owner.user_id = projects.user_id 
    LEFT OUTER JOIN users AS users_winner ON users_winner.user_id = projects.winner_user_id 
संबंधित मुद्दे