Mysql group_concat with distinct and where 给出奇怪的结果
Posted
技术标签:
【中文标题】Mysql group_concat with distinct and where 给出奇怪的结果【英文标题】:Mysql group_concat with distinct and where gives strange results 【发布时间】:2014-07-11 07:04:18 【问题描述】:我有以下查询可以正常工作(见下文)。
但是当我添加一个条件时,例如AND (specialtyName = '...')
主要结果很好,但是 GROUP_CONCAT 只显示匹配条件的结果。
谁能帮我解决这个问题?
提前致谢。
弗雷德。
SELECT
tblJobs.jobID,
tblJobs.jobName,
DATE_FORMAT(tblJobs.jobDate,'%d-%m-%Y'),
tblCompanies.companyID,
tblCompanies.companyName,
tblCompanies.companyNameConvert,
GROUP_CONCAT(DISTINCT tblSpecialties.specialtyName
ORDER BY FIELD (
specialtyName,
'specialtyName1',
'specialtyName2',
'specialtyName3'),
specialtyName ASC)
AS specialtyNames,
GROUP_CONCAT(DISTINCT tblSpecialties.specialtyNameConvert
ORDER BY FIELD (
specialtyName,
'specialtyName1',
'specialtyName2',
'specialtyName3'),
specialtyName ASC)
AS specialtyNamesConvert,
GROUP_CONCAT(DISTINCT tblRegions.regionName),
GROUP_CONCAT(DISTINCT tblRegions.regionNameConvert)
FROM tblJobs
LEFT JOIN tblCompanies ON
(tblJobs.jobCompany = tblCompanies.companyID)
LEFT JOIN tblSpecialties ON
FIND_IN_SET(tblSpecialties.specialtyID, REPLACE(tblJobs.jobSpecialty,' ',','))
LEFT JOIN tblRegions ON
FIND_IN_SET(tblRegions.regionID, REPLACE(tblJobs.jobRegion,' ',','))
WHERE
AND jobActive = '1'
AND jobDate >= '2013-01-01'
AND companyActive = '1'
GROUP BY jobID
ORDER BY jobDate DESC, jobID DESC, jobCompany DESC
【问题讨论】:
我很困惑。如果您添加一个where
子句限制 SpecialtyName
,您为什么担心结果中只包含这些专业?
嗨@Gordon。作业结果受到“where”子句的正确限制,但“specialtyNames”仅显示该特定作业的一个“SpecialtyName”,而不显示其他“specialtyNames”。
【参考方案1】:
如果你说:
WHERE jobActive = '1' AND jobDate >= '2013-01-01' AND companyActive = '1' AND
specialties = XXX
那么你只会得到这些专业。过滤是在聚合之前完成的。注意:在where
子句中包含这样的条件也会将外部连接变为内部连接。您的联接可能在正确对齐的外键关系上,因此内部联接可能是合适的。
我猜你真正想要的是按具有该专业的人过滤工作,但保留所有其他信息。您想在聚合之后进行过滤。使用having
子句而不是where
子句来做到这一点:
having sum(specialties = XXX) > 0;
这将只保留具有特定专业的行,并保留所有其他信息。
【讨论】:
嗨@Gordon,就是这样!非常感谢。完全不熟悉“HAVING”,但现在不熟悉了。【参考方案2】:我想为您的表和子查询使用别名可以解决您的问题。 你可以试试这样:
SELECT
tblJobs.jobID,
tblJobs.jobName,
DATE_FORMAT(tblJobs.jobDate,'%d-%m-%Y'),
tblCompanies.companyID,
tblCompanies.companyName,
tblCompanies.companyNameConvert,
(SELECT GROUP_CONCAT(DISTINCT ts.specialtyName
ORDER BY FIELD (
specialtyName,
'specialtyName1',
'specialtyName2',
'specialtyName3'),
specialtyName ASC)
FROM tblSpecialties ts) AS specialtyNames ,
, ... ,
FROM tblJobs
LEFT JOIN tblCompanies ON
(tblJobs.jobCompany = tblCompanies.companyID)
LEFT JOIN tblSpecialties ON
FIND_IN_SET(tblSpecialties.specialtyID, REPLACE(tblJobs.jobSpecialty,' ',','))
LEFT JOIN tblRegions ON
FIND_IN_SET(tblRegions.regionID, REPLACE(tblJobs.jobRegion,' ',','))
WHERE
AND jobActive = '1'
AND jobDate >= '2013-01-01'
AND companyActive = '1'
GROUP BY jobID
ORDER BY jobDate DESC, jobID DESC, jobCompany DESC
我没有测试此代码,但它可以提供帮助。
【讨论】:
您还有其他建议吗?您认为问题出在 GROUP_CONCAT 还是条件上?感谢您的宝贵时间。 您是否也尝试在主查询中为表设置别名?例如: ...LEFT JOIN tblSpecialities tblS ...以上是关于Mysql group_concat with distinct and where 给出奇怪的结果的主要内容,如果未能解决你的问题,请参考以下文章
LINQ with group_concat - 在一个字段中获取链接的表结果