2010-05-05 9 views
14

Je veux obtenir des résultats par requête simillar à:MySQL JOIN avec IF conditions

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

Toutes les idées?

Répondre

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 

Je pense que c'est ce que vous essayez de faire, est-ce pas?

Comme vous avez maintenant indiqué que le nombre de colonnes est différent, vous devez spécifier les colonnes, par ex.

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 

Dans cet exemple, a privé les colonnes col1, col2 et col3, tandis que la société a col1 et col4, mais vous les voulez tous.

+0

Je ne sais pas pourquoi maintenant j'ai # 1222 - Les instructions SELECT utilisées ont un nombre différent de colonnes – plugowski

+0

si j'utilise seulement une partie de code ie. SELECT * FROM utilisateurs LEFT JOIN privé que des détails sur users.id = details.user_id OÙ users.id = 1 ET users.type = 1 mais si j'utilise UNION J'AVONS obtenir erreur # 1222 – plugowski

+0

Si vous avoir un nombre différent de colonnes dans les deux tables (privé et entreprise), vous devrez spécifier le même nombre de colonnes dans le SELECT. Vous pouvez remplir les espaces en utilisant NULL, '', ou ce que vous voulez. – 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: La version originale de la réponse (question mal comprise):

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

Ce n'est pas exactement ce que je veux. privé et la société sont deux tables différentes, que je veux rejoindre: lorsque user.type == 1 Je veux JOIN privé sur user.id = private.user_id et quand user.type == 2 Je veux rejoindre la société ON user.id = company.user_id – plugowski

+0

@plugowski: Voir la réponse modifiée. – Tomalak

15

Je suis sûr que c'est déjà résolu, mais pour les personnes ayant un problème similaire.

Vous pouvez également essayer de multiples gauche pour obtenir toutes les jointures des données

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)