我有以下查询:
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
包含一些公司的电话号码...
我猜我只得到第一个...或随机,我不确定。
如何重写此查询,以便返回每个公司的所有电话号码?
答案 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