我添加了这个简单的例子,以显示我遇到的问题。说这是我的数据库foo。
SELECT
`people`.`id`
, `people`.`name`
, `places`.`place_type`
, `places`.`aread`
, `family`.`family_count`
, `income`.`income_value`
, `income`.`average`
, `employment`.`address`
, `employment`.`duration`
FROM
`people`
INNER JOIN `places`
ON (`people`.`id` = `places`.`id`)
INNER JOIN `family`
ON (`people`.`id` = `family`.`id`)
INNER JOIN `income`
ON (`people`.`id` = `income`.`id`)
INNER JOIN `employment`
ON (`people`.`id` = `employment`.`id`) WHERE `people`.`full_name` = ? LIMIT 1
现在问题是如果people.id
与其他列中的每个id都不匹配,我会得到空值。这是因为并非所有具有id的人都在地方,家庭,收入......列中找到。
所以,我想知道如何始终从people.id
返回一个值,即使people.id
与例如income.id
不一样。function\s+([^(]+)\s*\(\s*[^)]+\s*\)\s*{
答案 0 :(得分:2)
只需将您的联接更改为LEFT JOIN
即可返回LEFT
表中的所有记录,只返回RIGHT
表中的匹配项:
SELECT
`people`.`id`
, `people`.`name`
, `places`.`place_type`
, `places`.`aread`
, `family`.`family_count`
, `income`.`income_value`
, `income`.`average`
, `employment`.`address`
, `employment`.`duration`
FROM
`people`
LEFT JOIN `places`
ON (`people`.`id` = `places`.`id`)
LEFT JOIN `family`
ON (`people`.`id` = `family`.`id`)
LEFT JOIN `income`
ON (`people`.`id` = `income`.`id`)
LEFT JOIN `employment`
ON (`people`.`id` = `employment`.`id`) WHERE `people`.`full_name` = ? LIMIT 1
编辑:如果您想知道哪些表没有匹配,只需搜索空值。离开加入时,与条件不匹配的表格将在列选择中获得NULL
个值。
答案 1 :(得分:1)
将LEFT JOIN
替换为INNER JOIN
。
SELECT
`people`.`id`
, `people`.`name`
, `places`.`place_type`
, `places`.`aread`
, `family`.`family_count`
, `income`.`income_value`
, `income`.`average`
, `employment`.`address`
, `employment`.`duration`
FROM
`people`
LEFT JOIN `places`
ON (`people`.`id` = `places`.`id`)
LEFT JOIN `family`
ON (`people`.`id` = `family`.`id`)
LEFT JOIN `income`
ON (`people`.`id` = `income`.`id`)
LEFT JOIN `employment`
ON (`people`.`id` = `employment`.`id`) WHERE `people`.`full_name` = ? LIMIT 1