2016-09-18 2 views
0

이상한 결과를 제공하는 데그룹 CONCAT 내가이 SQL 쿼리를

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에는 모든 다른 interest_id가있는 3 개의 행이있을 수 있습니다. group_concat이 여기 내 문제를 해결합니다. 이 쿼리는 정상적으로 작동합니다. 내가 ID에 의해 이익에 HAVING에 필터를 추가하면

1)이 한 행 대신 예상되는 두 행의 날을 반환

그러나, 나는 발생이 문제는 다음과 같습니다.

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로 기록하고 또한 vacancy_id = 6을 반환해야합니다.

나에게 가장 이상한 것은 내가 똑같은 일을하지만 스킬 (IN (4)에 기술이 있음) ,이 올바른 결과를 여러 행을 반환하지 않습니다. 나는 (함께 HAVING의 관심과 능력을 가진 date_from에 필터링 할

2), 나는 다음을 수행하십시오

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년 9월 10일 (2016년 9월 13일 0시 0분 0초)보다 날 더있다?

답변

1

귀하의 HAVING 조항은 잘못 조건의 존재를 확인하는 방법. 연접 된 값을 사용하는, 바로 사용

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

당신이 할 때 : 그럼 당신은 문자열을 숫자로 비교하는

HAVING interests IN (17) 

. 문자열은 자동으로 숫자로 변환됩니다. 이 경우 첫 번째 요소 만 변환됩니다. 따라서 interests이 "17"로 시작하면 일치합니다. 그렇지 않으면 일치하지 않습니다.

distinctgroup_concat()에 사용하는 방법은 관심 분야와 기술이 너무 많지 않는 한 괜찮습니다. 공석에 대해 각각 100 개가있는 경우 중간 결과는 10,000 개의 행을 가지며 처리하는 데 더 오래 걸립니다. 그러나, 각각의 소수에, 방법은 좋다.

+0

최대 30 개의 관심 분야 최대 및 10 개의 기술이 있으며, 1 공석 당 최대 3 개입니다. 곧 업그레이드 할 계획은 아닙니다. :) 답변이 완벽하게 작동합니다 감사합니다! – Dennis