MySQL查询使用不同的表和过滤器

时间:2016-09-17 16:16:07

标签: mysql sql

我有一张名为'vacancies'的表,其中有一个'vacancy_id'PK。它看起来像这样:

    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

即使空缺在vacancy_interest表中有3个interest_id行,此查询也只会返回1 interest_id的空缺。如果我删除了GROUP BY语句,我会得到3行同样的空缺,这也不是我想要的。

理想情况下,我希望interest_id分别位于单独的列中或由逗号分隔的同一字段中。或者,如果有任何其他可能性/建议随时分享!

1 个答案:

答案 0 :(得分:2)

您可以使用group_concat获取以逗号分隔的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

参考你关于添加例如:

的评论

您可以添加条件

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 by对选定的结果行执行相关操作。