复杂的mysql查询,具体加入

时间:2013-06-28 19:06:55

标签: mysql

我遇到了问题。 我有3个表,我在选择时需要内部连接。通常它会像

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`)

问题是,wp_fs_reports.agent_idwp_fs_reports.form_id可以具有wp_rg_form.idwp_fs_agents.id中不存在的值(' 0')。因此它只会输出存在的值。问题是,是否可以输出那些提到的值= 0的行,用" All&#34 ;;替换那些行中的wp_fs_agents.namewp_rg_form.title。 我认为,替换它会像

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

2 个答案:

答案 0 :(得分:1)

您可以使用左JOIN和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`)

答案 1 :(得分:1)

您可以离开加入wp_fs_agents表格,其中包含wp_fs_reportsagent_id 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

如果agent_id表中没有表示除{0}以外的wp_fs_agents个值,它们也会出现在结果中,因此您需要其他一些排除它们的方法。