2010-04-21 9 views
1

Existe-t-il un moyen d'éviter d'ajouter une seconde LEFT JOIN pour la table "social_mcouple" afin d'interroger où social_members.m_id = social_mcouple.c_id ci-dessous?Évitez plusieurs LEFT JOIN

$res = @mysql_query("SELECT *, DATE_FORMAT(m_lld,'%m/%d/%y') AS m_lld_formatted FROM social_members 
     LEFT JOIN social_member_types ON t_id=m_type WHERE m_user='".$en['user']."'"); 
+0

Astuce! Utilisez des normes communes pour les dates;) http://en.wikipedia.org/wiki/ISO_8601 –

+0

Je ne suis pas sûr que je suis - Vous voulez des champs d'une autre table mais vous ne voulez pas ajouter la table à la requête? – thetaiko

+0

Je me demandais si le social_mcouple peut être ajouté sans LEFT JOIN On m'a toujours dit que les jointures à gauche peuvent ralentir un serveur s'il est utilisé de manière incorrecte. puisque j'en ai déjà un, puis-je ajouter une seconde sans problème de performance à long terme? – acctman

Répondre

2

S'il y aura toujours un social_mcouple qui correspond à social_members, ou vous êtes seulement intéressé par les lignes où il y a une correspondance, vous pouvez utiliser un INNER JOIN. Si vous avez besoin de tous les membres de social_members, qu'il y ait un social_mcouple correspondant, vous aurez besoin d'un LEFT JOIN. Le LEFT JOIN vous donnera toutes les lignes avec social_mcouple.* mis à NULL où il n'y a pas de correspondance.

La performance dépendra vraiment de la taille de vos jeux de données.

EDIT: ajout d'un exemple de requête UNION.

$res = @mysql_query(" 
(SELECT social_members.*, social_member_types.*, DATE_FORMAT(m_lld,'%m/%d/%y') AS m_lld_formatted, 
    NULL AS mcouple1, NULL AS mcouple2, NULL AS mcouple3 
FROM social_members 
LEFT JOIN social_member_types ON t_id=m_type 
WHERE m_user='".$en['user']."' AND m_type != 2) 

UNION 

(SELECT social_members.*, social_member_types.*, DATE_FORMAT(m_lld,'%m/%d/%y') AS m_lld_formatted, 
    social_mcouple.mcouple1, social_mcouple.mcouple2, social_mcouple.mcouple3 
FROM social_members 
LEFT JOIN social_member_types ON t_id=m_type 
    JOIN social_mcouple ON social_members.m_id = social_mcouple.c_id 
WHERE m_user='".$en['user']."' AND m_type = 2) 
"); 
+0

Je n'aurai besoin que de tous les champs de social_mcouple SI social_member.m_id = social_mcouple.c_id SI ce n'est pas le cas, la table social_mcouple ne sera pas nécessaire du tout. Donc, si je lis correctement votre réponse dans mon cas, LEFT JOIN est ce dont j'ai besoin et pas INNER JOIN? – acctman

+0

Existe-t-il un moyen d'écrire l'instruction presque comme une instruction IF WHERE IF m_type = 2 Alors lancez LEFT JOIN pour social_mcouple SI ne gardez pas la même instruction? – acctman

+0

@acctman - c'est correct. – thetaiko