2013-06-28 6 views
0

J'ai un problème. J'ai 3 tables et j'ai besoin de jointure interne entre elles lors de la sélection. Normalement, ce serait quelque chose commeRequête mysql complexe, jointure spécifique

select `wp_fs_reports`.*,`wp_fs_agents`.`name`,`wp_rg_form`.`title` from `wp_fs_reports` 
INNER JOIN `wp_rg_form` ON (`wp_fs_reports`.`form_id` = `wp_rg_form`.`id`) 
INNER JOIN `wp_fs_agents` ON(`wp_fs_reports`.`agent_id` = `wp_fs_agents`.`id`) 

Le problème est, wp_fs_reports.agent_id et wp_fs_reports.form_id peut avoir une valeur (« 0 ») qui ne figure pas dans wp_rg_form.id et wp_fs_agents.id. Donc, il ne sortira que les valeurs qui sont présentes. La question est, est-il possible de produire même les lignes où les valeurs mentionnées = 0, en remplaçant wp_fs_agents.name et wp_rg_form.title dans ces lignes avec "Tous"; Je pense, pour remplacer ce serait quelque chose comme

IF(`agent_id` = '0', 'All', `wp_fs_agents`.`name`) as `name 

Répondre

1

Vous pouvez utiliser une jointure gauche et la fonction COALESCE:

SELECT 
    `wp_fs_reports`.*, 
    COALESCE(`wp_fs_agents`.`name`,'All'), 
    `wp_rg_form`.`title` 
FROM 
    `wp_fs_reports` 
    LEFT JOIN `wp_rg_form` ON (`wp_fs_reports`.`form_id` = `wp_rg_form`.`id`) 
    LEFT JOIN `wp_fs_agents` ON(`wp_fs_reports`.`agent_id` = `wp_fs_agents`.`id`) 
+0

wow, merci beaucoup –

1

Vous pouvez vous désinscrire joindre à la table wp_fs_agents, qui comprendra wp_fs_reports lignes n'ont pas agent_id dans wp_fs_agents:

select 
    wp_fs_reports.*, 
    IF(wp_fs_reports.agent_id = '0', 'All', wp_fs_agents.name) as name, 
    wp_rg_form.title 
from wp_fs_reports 
INNER JOIN wp_rg_form ON wp_fs_reports.form_id = wp_rg_form.id 
LEFT JOIN wp_fs_agents ON wp_fs_reports.agent_id = wp_fs_agents.id 

S'il y a agent_id va Les valeurs autres que zéro qui ne sont pas représentées dans la table wp_fs_agents seront également incluses dans les résultats, vous aurez donc besoin d'un autre moyen pour les exclure.

+0

merci, cela fonctionne, sauf qu'il devrait être un peu différent. Au lieu de 'wp_rg_form.title', il devrait être' IF (wp_fs_reports.form_id = '0', 'All', wp_rg_form.title) comme titre'. Et au lieu de l'intérieur, il devrait être laissé. En outre, vous avez oublié (après ON. –