2010-05-05 12 views

उत्तर

21
SELECT * FROM users 
LEFT JOIN private AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type = 1 

UNION 

SELECT * FROM users 
LEFT JOIN company AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type != 1 

मुझे लगता है कि यह है कि आप क्या करने के लिए कोशिश कर रहे हैं, हैं ना?

जैसा कि आपने अभी कहा है कि कॉलम की संख्या अलग है, आपको कॉलम निर्दिष्ट करना होगा, उदा।

SELECT 'private' AS detailType, users.*, col1, col2, col3, '' FROM users 
LEFT JOIN private AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type = 1 

UNION 

SELECT 'company', users.*, col1, '', '', col4 FROM users 
LEFT JOIN company AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type != 1 

इस उदाहरण में, निजी, जबकि कंपनी col1 और col4 है, कॉलम col1, col2 और col3 है, लेकिन आप उन सब चाहते हैं।

+0

मुझे नहीं पता कि अब मुझे # 1222 - उपयोग किए गए SELECT कथनों में कॉलम – plugowski

+0

की एक अलग संख्या है यदि मैं कोड का केवल एक हिस्सा यानी उपयोग करता हूं। चुनें * उपयोगकर्ताओं से बाईं तरफ users.id = details.user_id कहां users.id = 1 और users.type = 1 विवरण के रूप में निजी शामिल हों लेकिन अगर मैं यूनिअन का उपयोग मैं 1222 – plugowski

+0

आप तो प्राप्त होने वाले त्रुटि # है दो तालिकाओं (निजी और कंपनी) में कॉलम की एक अलग संख्या है तो आपको SELECT में समान कॉलम निर्दिष्ट करने की आवश्यकता होगी। आप नल, '', या जो भी आप चाहते हैं, का उपयोग करके रिक्त स्थान भर सकते हैं। – Cez

6
SELECT 
    users.*, 
    details.info, 
    CASE users.type WHEN '1' THEN 'private' ELSE 'company' END AS user_type 
FROM 
    users 
    INNER JOIN (
    SELECT user_id, info FROM private 
    UNION 
    SELECT user_id, info FROM company 
) AS details ON details.user_id = users.id 

संपादित करें: उत्तर (सवाल गलत समझा) के मूल संस्करण:

SELECT 
    *, 
    CASE type WHEN '1' THEN 'private' ELSE 'company' END AS details 
FROM 
    users 
WHERE 
    users.id = 1 
+0

यह बिल्कुल मैं क्या चाहते हैं नहीं है पाने के लिए मिलती है। निजी और कंपनी दो विभिन्न टेबल, जो मैं में शामिल करना चाहते हैं: user.type == 1 मैं पर user.id = private.user_id और user.type == 2 मैं शामिल हों चाहते हैं जब कंपनी निजी शामिल हों चाहते हैं जब User.id = company.user_id – plugowski

+0

@plugowski पर: बदले गए उत्तर देखें। – Tomalak

15

मुझे यकीन है कि यह पहले से ही हल हो चुका है, लेकिन इसी तरह की समस्या वाले लोगों के लिए।

आप एक से अधिक बाईं ओर कोशिश कर सकते हैं सभी डेटा

SELECT *, IF (users.type = 1, p.name, c.name) AS name FROM users 
LEFT JOIN private AS p ON (users.type = 1 AND users.id = p.user_id) 
LEFT JOIN company AS c ON (users.type != 1 AND users.id = c.user_id)