在内连接上获得多于一列

时间:2011-09-26 21:05:30

标签: mysql sql inner-join

我有以下查询:

SELECT c.company_id, c.company_title, c.featured, a.address, a.postal_code, pc.city, pc.region,cat.category_title, p.phone
FROM dloc.companies c 
    INNER JOIN dloc.address a ON ( c.address_id = a.address_id  )  
  INNER JOIN dloc.postal_code pc ON ( a.postal_code = pc.postal_code )
  INNER JOIN dloc.company_categories cc ON ( c.company_id = cc.company_id )
  INNER JOIN dloc.categories cat ON ( cc.category_id = cat.category_id )
  INNER JOIN dloc.phones p ON ( c.company_id = p.company_id )

WHERE c.company_title like '%gge%'

一切正常。 唯一的事情就是..好吧。 phones包含一些公司的电话号码... 我猜我只得到第一个...或随机,我不确定。 如何重写此查询,以便返回每个公司的所有电话号码?

4 个答案:

答案 0 :(得分:2)

鉴于该查询,您应该为每个电话号码行(每家公司)获取一行。 SQL用作关系/集数学/理论 - 具有'-many'关系意味着返回多行(因此,您的查询应该已经完成​​了所需的行为)。

通常,编写查询经验的人不会获得多行 - 它会将其限制为所需的“单行”。


编辑:

结果订购 -
按照惯例,SQL返回无序的东西,除非给出某种显式排序(通过使用ORDER BY子句)。您看到“随机”电话号码“首先”返回,因为RDBMS仍然必须按顺序读取/返回结果;当系统选择访问数据时使用的标记时,此顺序在运行时确定(...通常)。完整的互动相当复杂(可能是供应商特定的),所以请记住这一点:
除非您指定了您的结果,否则结果将以随机顺序返回

答案 1 :(得分:1)

我建议你在p.phone字段上使用GROUP_CONCAT

但需要考虑一些因素:

  • 看起来公司可以拥有多部手机。但是,没有!因此,您应该将INNER JOIN更改为LEFT JOIN,以便将其考虑在内。
  • 看起来公司也可以拥有多个地址。如果这是真的,不仅要考虑先前的考虑因素,而且还应该重新设计查询以适应这种情况。

答案 2 :(得分:0)

您应该获取给定公司ID的所有电话号码,因为连接首先在两个表之间执行笛卡尔积,然后删除与连接中的条件不匹配的所有“行”。

答案 3 :(得分:0)

group_concat会在一栏中收集所有电话号码 如果您确定每家公司没有列出多次其他值,请在company_id上添加group by 如果没有,请在group_concat中添加“重复”(因为缺少更好的词)值。

SELECT 
  c.company_id
  , c.company_title
  , c.featured
  , a.address
  , a.postal_code
  , pc.city
  , pc.region
  , cat.category_title
  , GROUP_CONCAT(p.phone) as phonenumbers
FROM dloc.companies c 
INNER JOIN dloc.address a ON ( c.address_id = a.address_id  )  
INNER JOIN dloc.postal_code pc ON ( a.postal_code = pc.postal_code )
INNER JOIN dloc.company_categories cc ON ( c.company_id = cc.company_id )
INNER JOIN dloc.categories cat ON ( cc.category_id = cat.category_id )
INNER JOIN dloc.phones p ON ( c.company_id = p.company_id )
WHERE c.company_title like '%gge%'
GROUP BY c.companyid

请参阅:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat