【问题标题】:How to join these tables together?如何将这些表连接在一起?
【发布时间】:2011-04-02 02:56:15
【问题描述】:

我将很多表连接在一起,我想在 company2city 表中计算公司的编号城市,同时将其链接到公司表中的一行,然后找出结束时间是否超过现在.. company2city 是与city 表链接在一起的多对多表。一个公司可以有很多城市,并且在 company2city 表中。

SELECT COUNT(company2city.cityid) as location, city.city 
FROM company 
INNER JOIN company2city ON company.id = company2city.companyid
INNER JOIN city ON company2city.cityid = city.id AND company.endtime > now()
GROUP BY company2city.cityid

该 select 语句有效,但它只选择那些在 company2city 表中有实例并且 company.endtime 大于 now() 的城市。我想要的是同时选择城市表中的所有城市,如果 company.endtime() > now() 失败,它只会将 COUNT(company2city.cityid) 设为 location = 0

我该如何做这样的选择语句?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我相信您想要的是左连接而不是内连接。左连接无论如何都会连接,并在无法连接的地方返回 null。

    试试这个

    SELECT COUNT(company2city.cityid) as location, city.city  
    FROM city  
    LEFT JOIN company2city on city.id = company2city.cityid  
    LEFT JOIN company on company.id = company2city.companyid  
    where company.endtime > now()  
    group by city.city
    

    【讨论】:

    • 不幸的是它没有返回空值
    • @Kevin 我改了group by statement,现在试试吧
    • 你说它没有返回空值。它应该返回 0 作为它将为空的计数。这就是你的意思,对吧?它不返回 0,它只是返回大于 0 的计数?我只是想理解,因为这对我有类似的查询。
    • 是的,它返回大于 0 的计数,但没有返回 0..
    • 我想我会选择 2 个选择语句
    【解决方案2】:

    我觉得有点像

      SELECT COALESCE (COUNT (company2city.cityid), NULL) AS location, city.city
        FROM company
             LEFT JOIN company2city
                ON company.id = company2city.companyid
             LEFT JOIN city
                ON company2city.cityid = city.id AND company.endtime > now ()
    GROUP BY company2city.cityid
    

    应该适合你。我从来没有真正尝试过使用 MYSQL 选择中的合并,但我知道它可以与 Oracle 一起使用。但关键是使用左连接而不是内连接。

    【讨论】:

    • 您从未使用过 COALESCE 的事实可能解释了您在这里使用它的方式,这实际上没有任何意义。但也许你的意思不同。我建议您解释解决方案背后的想法,有人可能会建议进行必要的更正。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2014-01-02
    • 2021-12-06
    相关资源
    最近更新 更多