MySQL - 如何指示用户是否申请工作?

时间:2011-12-07 03:50:52

标签: mysql sql

我有一个像这张图片的数据库架构:

enter image description here

我想编写一个查询,选择所有6个表的数据和一个字段,指示特定用户是否申请了作业。

我试过了:

SELECT j.id, j.expired_date, j.title, j.views, j.status
   , j.unread, j.applicants, j.location, j.created_date
   , j.contract_type, c.country
   , group_concat(DISTINCT jp.page_name) AS fan_pages
   , group_concat(DISTINCT jp.id_page) AS id_pages
   , app.id AS applied
FROM jobs AS j
INNER JOIN country AS c ON c.id = j.country
LEFT JOIN job_pages AS jp ON jp.id_job = j.id
LEFT JOIN applications AS app ON app.id_job = j.id
LEFT JOIN resumes AS res ON res.id = app.id_resume
LEFT JOIN applicants AS alc ON alc.id = res.id_applicant
   AND alc.id_user = 15
WHERE ( j.status = 0 )
   AND ( j.expired_date = 0
      OR j.expired_date > 1323228856 )
GROUP BY `j`.`id`
ORDER BY `j`.`id` desc
LIMIT 5 OFFSET 5

但它返回的结果表明任何用户都应用了作业。我该如何重写这个查询?

2 个答案:

答案 0 :(得分:2)

- 编辑 -

以下是有关如何更轻松地跟踪已申请职位的用户的基本ERD。我将用户和简历之间的关系设为1:M,以防您想要跟踪简历版本。如果不是,它应该是1:1的关系。

因此,鉴于ERD,您有一个用户申请一份简历。如果要使简历可选,则从M:M中删除Resume表和Job,并直接链接到User。

只是一些想法......

enter image description here

- 原创 -

只是一些建议。

在我看来,您可能需要重新访问架构设计。看起来申请人表应该是用户和作业表之间的数据透视表。用户和作业表具有M:M关系,因为许多用户可以应用于许多作业,并且许多作业可以应用许多作业。当用户申请工作时,申请人表应充当交易表。

另外,简历表不应该直接链接到users表吗?应用程序如何拥有简历?

用户拥有简历。

用户申请简历(申请人)。

答案 1 :(得分:1)

试试吧,

SELECT j.id_user as creator, alc.id_user as applier, j.id , j.expired_date, j.title, j.views, j.status
   , j.unread, j.applicants, j.location, j.created_date
   , j.contract_type, c.country
   , group_concat(DISTINCT jp.page_name) AS fan_pages
   , group_concat(DISTINCT jp.id_page) AS id_pages
   , MAX(app.id) AS applied
FROM jobs AS j
INNER JOIN country AS c ON c.id = j.country
LEFT JOIN job_pages AS jp ON jp.id_job = j.id
LEFT JOIN applications AS app ON app.id_job = j.id
LEFT JOIN resumes AS res ON res.id = app.id_resume
LEFT JOIN applicants AS alc ON alc.id = res.id_applicant
WHERE
 (  alc.id_user = 15 or alc.id_user IS NULL) AND
( j.status = 0 )
   AND ( j.expired_date = 0
      OR j.expired_date > 1323228856 )
GROUP BY `j`.`id`
ORDER BY `j`.`id` desc

更新

我相信,现在查询更好:

SELECT 
    j.id, j.expired_date, j.title, j.views, j.status
   , j.unread, j.applicants, j.location, j.created_date
   , j.contract_type, c.country
   , group_concat(DISTINCT jp.page_name) AS fan_pages
   , group_concat(DISTINCT jp.id_page) AS id_pages
   , max(app.id) AS applied
FROM users AS u
LEFT JOIN jobs AS j ON 1
INNER JOIN country AS c ON c.id = j.country
LEFT JOIN job_pages AS jp ON jp.id_job = j.id
LEFT JOIN applicants AS alc ON alc.id_user = u.id
LEFT JOIN resumes AS res ON res.id_applicant = alc.id
LEFT JOIN applications AS app  ON app.id_resume = res.id AND app.id_job = j.id
WHERE u.id = 16 AND
        ( j.status = 0 )
       AND ( j.expired_date = 0 OR j.expired_date > 1323228856 )
GROUP BY j.id
ORDER BY j.id

新更新:

  1. 如果你想获得app.id,请使用MAX函数,因为当你对一行或多行进行分组时,max函数将正确返回你想要的id,否则只返回第一行,而NULL可能是错误的
  2. 加入表用户和作业
  3. 加入应用程序时应该使用id_resume和id_job