MySQL如何做多个列的INNER JOIN,即使有些为null。

时间:2016-04-06 07:36:27

标签: mysql

我添加了这个简单的例子,以显示我遇到的问题。说这是我的数据库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*{

2 个答案:

答案 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