2016-09-17 64 views
0

我有一個名爲'vacancycies'的表有一個'vacancy_id'PK。它看起來像這樣:使用不同表格和過濾器的MySQL查詢

create table vacancies 
(
    vacancy_id   int not null auto_increment, 
    org_id    int not null, 
    name     varchar(255) not null comment 'title', 
    vacancy_visibility_start_date datetime comment 'vacancy visibility date, when it needs to be active on the website', 
    vacancy_visibility_end_date  datetime, 
    primary key (vacancy_id) 
); 

在此之後,我有幾個其他錶鏈接到這一個。

create table vacancy_calendar 
(
    vacancy_calendar_id int not null auto_increment, 
    vacancy_id   int, 
    date_from   datetime not null, 
    date_to    datetime not null, 
    primary key (vacancy_calendar_id) 
); 

create table vacancy_interests 
(
    vacancy_id   int, 
    interest_id   int 
); 
create table vacancy_skills 
(
    vacancy_id   int, 
    skill_id    int 
); 

所有這些表可以包含同一個vacancy_id的多行。

我的頁面有不同的過濾器,我想通過AJAX進行處理。 我希望每個空位都有一行包含我需要的所有數據+它必須符合我的過濾標準。然而,我不知道我的查詢如何看起來像檢索我正在尋找的結果。 可以根據'interest_id','skill_id','date_from'和'date_to'進行過濾。

我開始用下面的查詢,但我堅持非常快:

SELECT v.*, vi.interest_id 
FROM `vacancies` as v 
INNER JOIN `vacancy_interests` as vi on v.vacancy_id = vi.vacancy_id 
GROUP BY v.vacancy_id 

這個查詢只能返回我1個interest_id的空缺,即使有空位的vacancy_interest表3個interest_id行。如果我刪除了GROUP BY語句,我會得到3行的空缺,這不是我想要的。

理想情況下,我想將interest_id分別放在單獨的列中或由逗號分隔的相同字段中。或者如果有任何其他可能性/建議,請隨時分享!

回答

2

您可以使用得到interest_id用逗號

SELECT v.*, group_concat(vi.interest_id) 
FROM `vacancies` as v 
INNER JOIN `vacancy_interests` as vi on v.vacancy_id = vi.vacancy_id 
GROUP BY v.vacancy_id 

參考你分開GROUP_CONCAT評價關於地方添加例如:

您可以添加WHERE條件

SELECT v.*, group_concat(vi.interest_id) 
FROM `vacancies` as v 
INNER JOIN `vacancy_interests` as vi on v.vacancy_id = vi.vacancy_id 
INNER JOIN `vacancy_skills` as vs ON vs.vacancy_id = v.vacancy_id 
WHERE vs.skill_id IN (4) AND vi.interest_id IN (1,3) 
GROUP BY v.vacancy_id 

在這種情況下, gorup_concat應用於結果行。因爲group通過對選定的結果行執行相關操作。

+0

作爲一個後續問題:如果我想在WHERE語句中添加一些過濾,如下WHERE vsskill_id IN(4)和vi.interest_id IN(1,3)。我該如何解決這個問題?這樣做會使得group_concat字段總是隻返回在where子句中傳遞的整數。 – Dennis

+0

@ Dennis ...我已經更新了答案.. – scaisEdge

+0

這不起作用,正如我在評論中提到的。考慮我有一行,其中skill_id列包含值「1,4,8」(因爲group_concat)。如果使用我的查詢與vs.skill_id IN(4)where子句,vs.skill_id列將只返回我4,而我也想保留在那裏的1和8值 – Dennis