2010-12-11 14 views
0

J'ai une table qui contient des messages d'utilisateurs et d'organisations. La table contient un champ appelé usertype qui indique si le message a été envoyé par un utilisateur ou une organisation.Mysql Join Une table avec deux autres tables basées sur une colonne de drapeaux

Je dois joindre cette table avec deux tables contenant les détails d'utilisateur et d'organisation respectivement.

Comment puis-je écrire une requête de jointure avec ces 2 tables?

Je pense que je peux réaliser cela via une union, mais peut-il être fait en utilisant seulement des jointures?

Table - L'UTILISATEUR chercher: nom d'utilisateur
Tableau - Organisation ira chercher le nom de l'organisation
Tableau Messages - entrées userid, usertype. Vous devez obtenir le nom d'utilisateur en vérifiant le type de données

+0

Vous ne devez pas avoir d'entités non liées dans une table. Utilisateurs dans une table d'utilisateurs, organisations dans une table d'organisations. UNION fonctionnera si vous avez vraiment besoin d'écrire cette requête étrange. –

Répondre

1

SYNDICATS et JOIN font des choses très différentes. Les UNIONs ajoutent des enregistrements à la fin d'une requête, JOINs ajoutent des champs à la fin d'un enregistrement.

Si votre requête UNION fonctionne, alors je vous recommande de rester avec elle. Si vous voulez vraiment faire cela avec JOINs, alors vous pouvez faire ce qui suit et modifier votre flux de travail en conséquence.

SELECT message_id, message_title, user.name, corp.name 
FROM group_messages 
LEFT JOIN users ON 
    users.user_id = group_messages.user_id 
    AND group_messages.usertype = "1" 
LEFT JOIN corp ON 
    corp.user_id = group_messages.user_id 
    AND group_messages.usertype = "0" 
; 

Ce que cela va faire est de retourner des enregistrements avec des champs pour les champs utilisateur ET pour corp. Lorsque le type d'utilisateur est 1, les champs utilisateur seront remplis et les champs corp seront null. Lorsque le type d'utilisateur est 0, les champs corp seront remplis et les champs utilisateur seront null. Vous devez écrire une logique d'application pour lire le type d'utilisateur renvoyé et déterminer l'ensemble de champs à lire. Honnêtement, si vous faites quelque chose comme ça, vous feriez bien mieux de faire deux requêtes distinctes.

Si vous ne souhaitez pas que les données de chaque type figurent dans des champs séparés, vous ne devez pas utiliser JOIN. Si vous voulez que les données de chaque type soient renvoyées dans le même champ, vous voulez une UNION que vous avez déjà.

+0

thnkz pour vos conseils je ferais mieux de m'en tenir à ma requête syndicat – Harish

0

My Query using Union peut-il être implémenté en utilisant join?

SELECT message_id, CONCAT_WS (» », fu. user_first_name, fu. user_last_name) uname, user_type, message_title, message_content, posted_on DE group_messages FGM REJOIGNEZ users fu ON FGM. user_type = '1' et fu. user_id = fgm. user_idgroup_id = '1' UNION
SELECT message_id, corporate_name uname, user_type, message_title, message_content, à partir de posted_on group_messagescorporate FGM JOIN fc ON FGM. user_type = '0' et fc. corporate_id = fgm. user_idgroup_id = '1'