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有问题,每个公司只有一部电话。。我一定是导入错了。请记住,您需要手工编写任何应用程序代码来处理任何选择。此外,根据用例,应该考虑建议左连接的各种答案/注释。单个电话号码最可能的原因是您的导入没有包含重复的电话号码(可能是因为实际数据,也可能是由于数据上的某些限制-重复或其他)。如果您希望来自同一家公司的所有电话号码都按顺序排列,请参阅“我的答案”的新编辑。