mysql - Group Concat 给出了奇怪的结果

标签 mysql

我有这个 SQL 查询:

SELECT v.*,  group_concat(distinct(vi.interest_id)) as interests, group_concat(distinct(vs.skill_id)) as skills, vc.date_from
FROM `vacancies` as v
LEFT JOIN `vacancy_interests` as vi on v.vacancy_id = vi.vacancy_id
LEFT JOIN `vacancy_skills` as vs on v.vacancy_id = vs.vacancy_id
LEFT JOIN `vacancy_calendar` as vc on v.vacancy_id = vc.vacancy_id
WHERE v.vacancy_visibility_end_date >= CURDATE()
GROUP BY v.vacancy_id

考虑此查询返回以下结果(最后 3 列是本问题中讨论的内容):

vacancy_id,org_id,name,description,number_required,occupancy_kind,website,offer,logo,banner,address_country,address_city,address_postal_code,address_line_1,address_line_2,vacancy_visibility_start_date,vacancy_visibility_end_date,engagement,interests,skills,date_from

    "2","1","test123","aze<sdgqswdfg","1","1","","blabla",NULL,"12049394_10208129537615226_4853636504350654671_n.jpg","Belgie","Brussel","1000","Brusselsestraat 15",NULL,"2016-09-02 00:00:00","2016-09-19 00:00:00","3","13,6,1","4,3","2016-09-13 00:00:00"
    "3","1","blablabla","lkpjoip","1","2","","blabla",NULL,NULL,"Belgie","Antwerpen","2000","Antwerpsestraat 16",NULL,"2016-09-02 00:00:00","2016-09-29 00:00:00","3","28","7,8,5","2016-09-01 00:00:00"
    "4","1","hahaha","14556dsf","1","3","","blabla",NULL,NULL,"Belgie","Mechelen","2800","Mechelsesteenweg 17",NULL,"2016-09-02 00:00:00","2016-09-28 00:00:00","3",NULL,NULL,"2016-09-26 00:00:00"
    "5","1","omggg","45sdfdj5","1","1","","blabla",NULL,NULL,"Belgie","Gent","3000","Gentsesteenweg 18",NULL,"2016-09-02 00:00:00","2016-09-30 00:00:00","3","17,11","4,1","2016-09-19 00:00:00"
    "6","1","this is a test","wauhiufdsq","1","2","","blabla",NULL,NULL,"Belgie","Luik","4000","Luikseweg 19",NULL,"2016-09-02 00:00:00","2016-09-30 00:00:00","3","19,17,22","6","2016-08-10 00:00:00"

请注意,空缺兴趣和空缺技能表可以包含单个空缺的多个记录。例如。空缺 3 可能有 3 行具有不同的interest_id。 group_concat 在这里解决了我的问题。 所以这个查询工作正常。

但是,我遇到了以下两个问题:

1) 当我在 HAVING 中通过 ID 添加过滤器时,这只返回一行而不是预期的两行。

SELECT v.*,  group_concat(distinct(vi.interest_id)) as interests, group_concat(distinct(vs.skill_id)) as skills, vc.date_from
FROM `vacancies` as v
LEFT JOIN `vacancy_interests` as vi on v.vacancy_id = vi.vacancy_id
LEFT JOIN `vacancy_skills` as vs on v.vacancy_id = vs.vacancy_id
LEFT JOIN `vacancy_calendar` as vc on v.vacancy_id = vc.vacancy_id
WHERE v.vacancy_visibility_end_date >= CURDATE()
GROUP BY v.vacancy_id
HAVING interests IN (17)

这仅返回一行。即记录 vacanacy_id 5,而它显然也应该返回 vacanacy_id = 6。

对我来说最奇怪的是,如果我做完全相同的事情,但对于技能(在(4)中拥有技能),这确实会返回多行且结果正确。

2)当我想过滤 date_from(以及 HAVING 中的兴趣和技能)时,我会执行以下操作:

SELECT v.*,  group_concat(distinct(vi.interest_id)) as interests, group_concat(distinct(vs.skill_id)) as skills, vc.date_from
FROM `vacancies` as v
LEFT JOIN `vacancy_interests` as vi on v.vacancy_id = vi.vacancy_id
LEFT JOIN `vacancy_skills` as vs on v.vacancy_id = vs.vacancy_id
LEFT JOIN `vacancy_calendar` as vc on v.vacancy_id = vc.vacancy_id
WHERE v.vacancy_visibility_end_date >= CURDATE() AND date(vc.date_from) > '2016-09-10'
GROUP BY v.vacancy_id
HAVING skills IN (4)

这只会返回空缺编号 5,而显然空缺编号 2 的日期也大于 2016-09-10 (2016-09-13 00:00:00)....

我在这里做错了什么?

最佳答案

您的 HAVING 子句是检查条件是否存在的错误方法。不使用连接值,只需使用:

HAVING MAX(vi.interest_id IN (17)) > 0

当你这样做时:

HAVING interests IN (17)

然后您将字符串与数字进行比较。该字符串会默默地转换为数字。在这种情况下,仅转换第一个元素。因此,如果兴趣以“17”开头,则匹配,否则不匹配。

另外,请注意,只要没有太多兴趣和技能,您在 group_concat() 中使用 distinct 的方法就可以。如果每个空缺有 100 个,那么中间结果将有 10,000 行,并且需要更长的时间来处理。然而,只要每种都只有少数,这个方法就可以了。

关于mysql - Group Concat 给出了奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39558670/

相关文章:

mysql - Tomcat Jdbc连接池事件连接

php - MySQL SELECT 将列添加到查询(如果未选择)

php - 使用 PHP 将 MySQL 数据导出到 .csv

python - 检查之前没有行插入后插入 scrapy 数据

mysql - 查找满足两个条件且唯一的行

php - 为什么我的 tmp_file_upload 文件不存在?我正在使用 php 5.6

java - 使用基于 android 的客户端从 mysql 中获取数据

mysql - 获取列名称以及第一行值?

mysql - 显示记录组之间的平均时间

mysql - 您应该以多少列制作另一张表?