【问题标题】:Join If Exists in a MySQL query如果 MySQL 查询中存在则加入
【发布时间】:2011-09-10 21:34:30
【问题描述】:

我正在运行一份报告,将委员会成员的信息导出到 Excel 电子表格中。

这是我的查询:

SELECT membership_organization.name AS Firm, 
membership_individual.first AS FirstName, 
membership_individual.middle AS MiddleName, 
membership_individual.last AS LastName, 
membership_individual.email AS Email, 
membership_individual.phone AS Phone, 
membership_location.addr1 AS Address1, 
membership_location.addr2 AS Address2, 
membership_location.city AS City, 
membership_location.state AS State, 
membership_location.zipcode AS Zip 
FROM membership_individual 
JOIN membership_organization ON membership_individual.org_name_id = membership_organization.id 
JOIN membership_location ON membership_individual.location_id = membership_location.id 
WHERE membership_individual.id IN ({list if ids}) 
ORDER BY LastName

问题是一些成员没有设置位置 ID,或者它设置为 0,因此这些成员不会显示在报告中。

有什么方法可以让我限定位置 JOIN?如果成员位置 id 存在,请提取信息,如果不显示可用信息。

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    使用左连接,意味着你的查询将变成

    SELECT membership_organization.name AS Firm, 
    membership_individual.first AS FirstName, 
    membership_individual.middle AS MiddleName, 
    membership_individual.last AS LastName, 
    membership_individual.email AS Email, 
    membership_individual.phone AS Phone, 
    membership_location.addr1 AS Address1, 
    membership_location.addr2 AS Address2, 
    membership_location.city AS City, 
    membership_location.state AS State, 
    membership_location.zipcode AS Zip 
    FROM membership_individual 
    JOIN membership_organization ON membership_individual.org_name_id = membership_organization.id 
    LEFT JOIN membership_location ON membership_individual.location_id = membership_location.id 
    WHERE membership_individual.id IN ({list if ids}) 
    ORDER BY LastName
    

    您将获得所有成员的数据,即使是位置表中没有行的成员。

    【讨论】:

      【解决方案2】:

      尝试使用

      LEFT JOIN membership_location ON membership_individual.location_id = membership_location.id 
      

      而不是你的变种..

      【讨论】:

        【解决方案3】:

        使用左外连接:

        SELECT membership_organization.name AS Firm, 
        membership_individual.first AS FirstName, 
        membership_individual.middle AS MiddleName, 
        membership_individual.last AS LastName, 
        membership_individual.email AS Email, 
        membership_individual.phone AS Phone, 
        membership_location.addr1 AS Address1, 
        membership_location.addr2 AS Address2, 
        membership_location.city AS City, 
        membership_location.state AS State, 
        membership_location.zipcode AS Zip 
        FROM membership_individual 
        JOIN membership_organization ON membership_individual.org_name_id = membership_organization.id 
        LEFT OUTER JOIN membership_location ON membership_individual.location_id = membership_location.id 
        WHERE membership_individual.id IN ({list if ids}) 
        ORDER BY LastName
        

        【讨论】:

        • outer 是隐含的。 left join 就足够了。
        【解决方案4】:

        将您的两个JOINs 更改为LEFT JOINs。您将从membership_individual 中获取where 子句匹配的所有记录,以及其他行不匹配的表的NULL 值。

        【讨论】:

        • 是的,我认为这很简单,我想我需要喝杯咖啡。谢谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 1970-01-01
        • 2013-12-14
        • 2023-03-18
        • 1970-01-01
        • 2011-07-14
        相关资源
        最近更新 更多