Mysql 在内部联接上获取多个列

Mysql 在内部联接上获取多个列,mysql,sql,inner-join,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_cod

我有以下疑问:

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%'
一切正常。 唯一的问题是。。嗯<代码>电话包含一些公司的多个电话号码。。。 我想我只得到了第一个。。。或者是随机的,我不确定。
如何重写此查询,使其返回每个公司的所有电话号码?

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

group\u concat
将在一列中收集所有电话号码。
如果您确定每个公司没有超过一次列出其他值,请在公司id上添加一个
分组依据。
如果没有,也将那些“重复”(因为缺少更好的词)值放入
组中

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

请参阅:

给定该查询,您应该为每个电话号码行(每个公司)获取一行。SQL用作关系/集合数学/理论-具有“-many”关系意味着返回多行(因此,您的查询应该已经执行了所需的行为)

通常,人们编写查询时遇到的问题不是获得多行,而是将其限制为所需的“单个”行


编辑:

结果排序-
按照惯例,SQL返回无序的事物,除非给出某种明确的排序(通过使用
orderby
子句)。您会看到“随机”电话号码“先”返回,因为RDBMS仍然必须按顺序读取/返回结果;此顺序在运行时确定(…通常),此时系统在访问数据时选择要使用的指示符。完整的交互相当复杂(可能是特定于供应商的),因此请记住:
除非指定结果的顺序,否则结果将以随机顺序返回
句号。

我建议您使用
p.phone
字段

不过,有几点需要考虑:

  • 看起来一家公司可以拥有多部手机。但也没有!因此,您应该将
    内部联接
    更改为
    左联接
    ,以将其考虑在内
  • 看起来一家公司可以有多个地址。如果这是真的,那么不仅要考虑前面提到的问题,还要修改查询以适应这一点

+1但我认为您指的是每个“电话号码行”而不是每个“unqiue电话号码”。没有任何可以强制使用唯一的result@ConradFrix-我指的是电话号码行(我假设每行都有一个唯一的号码(每个公司))。编辑以消除歧义,谢谢。他希望电话号码都在同一行,而不是在不同的行中。一家公司可以没有到5部电话,一家公司只能有一个地址,但多家公司可以有相同的地址。这就是为什么我把表格分开。一家没有电话的公司在使用内部联接时不会被列入名单。您应该将其更改为
LEFT JOIN
OP是要求“一行中的所有电话号码”还是“多行中各有一个电话号码”似乎有些混淆。任何都可以,但我想我对db有问题,每个公司只有一部电话。。我一定是导入错了。请记住,您需要手工编写任何应用程序代码来处理任何选择。此外,根据用例,应该考虑建议
左连接的各种答案/注释。单个电话号码最可能的原因是您的导入没有包含重复的电话号码(可能是因为实际数据,也可能是由于数据上的某些限制-重复或其他)。如果您希望来自同一家公司的所有电话号码都按顺序排列,请参阅“我的答案”的新编辑。