2010-05-05 8 views
14

Ich möchte einige Ergebnisse über Abfrage erhalten simillar zu:MySQL JOIN mit IF-Bedingungen

SELECT 
    * FROM 
    users LEFT JOIN 
    IF (users.type = '1', 'private','company') AS details ON 
    users.id = details.user_id WHERE 
    users.id = 1 

Irgendwelche Ideen?

Antwort

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 

Ich denke, das ist, was Sie zu tun versuchen, ist es nicht?

Wie Sie jetzt gesagt haben, dass die Anzahl der Spalten unterschiedlich ist, müssten Sie die Spalten angeben, z.

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 

In diesem Beispiel verfügt über einen eigenen Spalten col1, col2 und col3, während Unternehmen col1 und col4 hat, aber Sie wollen sie alle.

+0

Ich weiß nicht, warum jetzt habe ich # 1222 - Die verwendeten SELECT-Anweisungen haben eine andere Anzahl von Spalten – plugowski

+0

, wenn ich nur einen Teil des Codes verwenden, dh. SELECT * FROM users LEFT JOIN privaten AS Details zu users.id = details.user_id WHERE users.id = 1 UND users.type = 1 aber wenn ich UNION verwenden Ich habe Fehler # 1222 – plugowski

+0

Wenn Sie erhalten Haben Sie eine andere Anzahl von Spalten in den zwei Tabellen (privat und Firma), müssen Sie die selbe Anzahl an Spalten im SELECT angeben. Sie können die Leerzeichen mit NULL, '' oder was auch immer Sie wollen füllen. – 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 

EDIT: Original-Version der Antwort (Frage falsch verstanden):

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

Es ist nicht genau das, was ich will. private und Firma sind zwei verschiedene Tabellen, denen ich beitreten möchte: wenn user.type == 1 Ich will privat verbinden ON user.id = private.user_id und wenn user.type == 2 Ich möchte JOIN Firma ON user.id = company.user_id – plugowski

+0

@plugowski: Siehe geänderte Antwort. – Tomalak

15

Ich bin sicher, dass dies bereits gelöst ist, aber für Menschen mit einem ähnlichen Problem.

Sie auch mehrere linke versuchen verbindet die alle Daten erhalten

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)