2016-09-18 6 views
0

奇妙な結果に与えたグループの連結方式は、私は、この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にはすべて3つの行があり、すべての異なるinterest_idがある可能性があります。 group_concatは私の問題をここで解決します。 したがって、このクエリは正常に動作します。

しかし、私が遭遇した2の問題は、以下の通りである:

1)私はこれが唯一の私の代わりに期待二列の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) 

これは私に1行しか返しません。つまり、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」で始まる場合は一致し、そうでない場合は一致します。

また、distinctgroup_concat()に使用する方法は、興味やスキルがあまりない限り、問題ありません。欠員のためのそれぞれの100があった場合、中間結果は10,000の行を持ち、処理に時間がかかります。しかし、ほんの一握りで、方法は問題ありません。

+0

最大30個の最大金利と10個のスキルがあり、空き1つにつき最大3個あります。すぐにこれらをアップグレードする予定はありません。 :) あなたの答えは完全にありがとうございます! – Dennis

関連する問題