2016-09-18 75 views
0

我有這樣的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's。 group_concat在這裏解決了我的問題。 所以這個查詢工作正常,因爲它應該。

不過,我遇到兩個問題有以下幾點:

1)當我通過ID在利益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() 
GROUP BY v.vacancy_id 
HAVING interests IN (17) 

這隻會返回一行。與vacanacy_id 5即記錄,同時它也應該顯然也返回vacancy_id = 6

的事情,是最奇怪的對我來說,如果我做同樣的事情,但對於技能(有技巧(4)) ,這會返回多行並顯示正確的結果。

2)當我想在date_from過濾(用在具有興趣和技能一起,我請執行下列操作:

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日00:00:00)大....

我在做什麼錯在這裏?

回答

1

HAVING條款是錯誤的方法來檢查是否存在條件使用級聯值,只需使用:

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

當你這樣做:

HAVING interests IN (17) 

然後您比較字符串到數字。該字符串被悄悄地轉換爲數字。在這種情況下,只有第一個元素被轉換。所以,如果interests以「17」開始,那麼它匹配,否則它不匹配。

此外,請注意,只要沒有太多興趣和技能,您在group_concat()中使用distinct的方法就沒有問題。如果每個空缺有100個,那麼中間結果將有10,000行 - 並且需要更長的時間來處理。然而,每種方法只有少數幾種,方法很好。

+0

最多隻有30個最大興趣和10個技能,每個空缺最多3個。沒有計劃很快升級這些。 :) 您的答案完美謝謝! – Dennis