2011-09-09 9 views
1

J'ai trois tables de gérer différents comptes de médias sociaux - facebook, twitter et linkedin. la requête suivante retournera bien les comptes facebook mais rien d'autre - qu'est-ce que je fais mal? chaque table est liée via un champ user_id mais chaque enregistrement a son propre id fiel également.left outer join question

SELECT 
    bla_facebook_accts.id as facebook, 
    bla_linked_in_accts.id as linkedin, 
    bla_twitter_accts.id as twitter 
FROM 
    bla_facebook_accts 
    LEFT OUTER JOIN 
    bla_linked_in_accts 
    ON 
     (bla_linked_in_accts.user_id = bla_facebook_accts.user_id) 
    LEFT OUTER JOIN 
    bla_twitter_accts 
    ON 
     (bla_linked_in_accts.user_id = bla_twitter_accts.user_id) 
WHERE bla_facebook_accts.user_id = '12'; 

des idées où je vais y wrong- i veulent tout simplement pour renvoyer une ligne pour si l'utilisateur dispose d'un compte sur chaque enregistrement Network- IE- dans chaque tableau

+3

Est-ce que user_id 12 ont un compte LinkedIn? – Cez

+2

Si ce n'est pas le cas, cela gâchera aussi la dernière jointure. Cela ressemble vraiment à trois requêtes totalement indépendantes. –

+0

Avez-vous une table 'user' avec tous les comptes d'utilisateurs? –

Répondre

2

le problème avec votre requête est que si l'utilisateur n'a pas de compte facebook, vous ne recevrez pas d'informations sur cet utilisateur. Et si l'utilisateur n'a pas de compte LinkedIn, vous ne recevrez pas d'informations sur son compte Twitter. GAUCHE REJOINT ne sont pas appropriés à cet effet, mais MySQL ne supporte pas FULL OUTER REJOINT, donc comme une solution de contournement que vous pouvez faire quelque chose comme ceci:

select 
    (select id from bla_facebook_accts where user_id = user.user_id) as facebook, 
    (select id from bla_linked_in_accts where user_id = user.user_id) as linkedin, 
    (select id from bla_twitter_accts where user_id = user.user_id) as twitter 
from 
    (select 12 user_id) user 
+0

@Chris J'ai ajouté quelques explications. – Karolis

+0

cela retourne un jeu d'enregistrements vide –

+0

@Chris Peut-être que vous avez fait quelque chose de mal. Ou peut-être avez-vous essayé ma première version de cette requête, car il y avait une faute de frappe qui est actuellement corrigée. – Karolis

1

Je pense que vous voulez utiliser INNER JOIN s si vous voulez retourner une ligne qui a un enregistrement dans toutes les tables.

SELECT 
    f.id as facebook, 
    l.id as linkedin, 
    t.id as twitter 
FROM 
    bla_facebook_accts f 
    INNER JOIN bla_linked_in_acctsn l ON f.user_id = l.user_id 
    INNER JOIN bla_twitter_accts t ON f.user_id = t.user_id 
+0

-1, C'est ainsi que nous avons fait des jointures internes en 1989. Ça fait 18 ans que ça ne fonctionne pas. Utilisez plutôt la syntaxe de jointure explicite. – Johan

0

essayer:

Sélectionnez t1.column, t2.column, t2.column de la table jointure externe gauche (t1, t2, t3) sur (t1.user_id = table.user_id ET t2.user_id = table.user_id ET t3.user_id = table.user_id)

etc

1

Après le commentaire sur aucun compte FB:

(SELECT 'Facebook' as 'ac', id FROM bla_facebook_accts WHERE user_id=12) 
UNION 
(SELECT 'LinkedIn' as 'ac', id FROM bla_linked_in_accts WHERE user_id=12) 
UNION 
(SELECT 'Twitter' as 'ac', id FROM bla_twitter_accts WHERE user_id=12) 
0

Vous n'obtiendrez jamais de réponse si vous essayez d'effectuer la deuxième jointure en utilisant l'identifiant linkedin si votre utilisateur n'a pas de compte linkedin mais dispose d'un compte facebook. Vous devez alwaysjoin en utilisant votre compte source (facebook)

SELECT 
    bla_facebook_accts.id as facebook, 
    bla_linked_in_accts.id as linkedin, 
    bla_twitter_accts.id as twitter 
FROM 
    bla_facebook_accts 
    LEFT OUTER JOIN 
    bla_linked_in_accts 
    ON 
     (bla_linked_in_accts.user_id = bla_facebook_accts.user_id) 
    LEFT OUTER JOIN 
    bla_twitter_accts 
    ON 
     (bla_linked_in_accts.user_id = bla_facebook_accts.user_id) 
WHERE bla_facebook_accts.user_id = '12'; 
1

Si vous souhaitez répertorier tous les comptes existants pour un utilisateur donné, quel que soit le nombre de comptes utilisateurs ont, LEFT JOIN (alias LEFT OUTER JOIN) est la bonne façon allez, mais vous devez vous joindre à quelque chose que vous savez exister pour tous les utilisateurs. Par conséquent, vous devez baser votre requête sur votre table utilisateur et joindre toutes les tables de l'id_utilisateur dans la table utilisateur.

Renommer userTable à tout ce que votre table utilisateur est appelé

SELECT 
    facebook.id as facebook, 
    linkedin.id as linkedin, 
    twitter.id as twitter 
FROM 
    userTable 
LEFT JOIN 
    bla_facebook_accts facebook ON (userTable.user_id = facebook.user_id) 
LEFT JOIN 
    bla_linked_in_accts linkedin ON (userTable.user_id = linkedin.user_id) 
LEFT JOIN 
    bla_twitter_accts twitter ON (userTable.user_id = twitter.user_id) 
WHERE 
    userTable.user_id = 12