2011-10-03 8 views
4

Salut les gars Im essayant de faire quelque chose commeMySQL instruction if conditionnelle se joindre

SELECT * from accounttable, peopletable, companytable 
WHERE if accounttable.account_type = company 
JOIN companytable 
WHERE companytable.id = accounttable.company_id 
ELSE IF accounttable.account_type = = person 
JOIN peopletable 
    WHERE peopletable.id = accounttable.person_id 

Je suis désolé un peu son sqlenglish mais je ne sais pas vraiment comment l'écrire!

+0

RACONTE-MOI TABLE SCHEMA ET RELATION entre ces tables .. vous avez beaucoup d'erreur de syntaxe – diEcho

+0

Comment pouvez-vous écrire une requête si vous ne savez pas ce que vous voulez faire? S'il vous plaît, essayez de décrire en mots ce que vous voulez. Cela vous aidera aussi. Souvent, vous voyez la solution dès que vous commencez à décrire le problème. – GolezTrol

+2

En lisant la pseudo-requête qui a été écrite, il semble @Akshat vouloir joindre 'accounttable' sur' peopletable' et 'companytable' en fonction de la valeur de' account_type'. Assez simple pour moi. – Romain

Répondre

15

Qu'en est-il quelque chose comme:

SELECT * 
from accounttable 
left join peopletable ON (accounttype = 'person' AND peopletable.id = accounttable.person_id) 
left join companytable ON (accounttype = 'company' AND companytable.id = accounttable.company_id) 

Je vais rejoindre contre les deux tables, vous aurez les champs de trois tables dans la sortie. Les champs de peopletable seront NULL si accounttype != 'person', et ceux de companytable seront NULLaccounttype != 'company'.

Vous pouvez trouver plus sur la syntaxe LEFT JOIN dans des endroits comme here ...

+0

Excellent fonctionne parfaitement, (troisième ligne peopletable.id est censé être companytable.companyid) très astucieux d'utiliser ce type acountype = xx et 'et' ensemble! – Akshat

+0

@Akshat a corrigé la réponse pour inclure votre note sur la faute de frappe;) – Romain

6
SELECT a.*, p.*, c.* from accounttable a 
LEFT JOIN peopletable p ON (a.person_id = p.id AND a.account_type = 'person') 
LEFT JOIN companytable c ON (a.company_id = c.id AND a.account_type = 'company') 

Notez que, p, c sont des alias pour les noms de tables complètes, cela permet d'économiser sur le typage.

Cette requête donnera tous null pour p. * Ou c. * D'affilée.
Vous pouvez réécrire la partie de sélection comme ceci:

SELECT 
    a.id, a.accounttype 
    , COALESCE(p.name, c.name) as name 
    , COALESCE(p.address, c.address) as address 
.... 
FROM ..... 

Voir: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce

+0

+1, trop vite, me battre – diEcho

+0

@diEcho: Romain avait donné une réponse rapide, non? –

0

IT doit être comme ci-dessous (pour autant que je comprends)

SELECT a.*,p.*,c.* 
FROM accounttable a 
LEFT JOIN companytable c ON c.id = a.company_id AND a.account_type = 'company' 
LEFT JOIN peopletable p ON p.id = a.person_id AND a.account_type = 'person' 
+0

erreur systax dans la requête. ON est 2 fois dans la 2ème jointure. –

+0

oups! sa faute de frappe. pourquoi downvoted !!, au moins mentionner d'abord – diEcho

+0

même chose faite par Johan avec moi à qui vous avez donné voteup. –