MySQL - Как указать, претендует ли пользователь на работу или нет? - PullRequest
0 голосов
/ 07 декабря 2011

У меня есть схема базы данных, подобная этой:

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 ]

2 голосов
/ 07 декабря 2011

- Редактировать -

Ниже приведена базовая ERD, чтобы было проще отслеживать пользователей, подавших заявки на работу.Я установил отношения между пользователем и Resume 1: M, на случай, если вы хотите отслеживать версии резюме.Если нет, то это должны быть отношения 1: 1.

Таким образом, учитывая ERD, у вас есть пользователь подать заявку на работу с резюме.Если вы хотите сделать резюме необязательным, то удалите таблицу «Возобновить» из M: M с заданием и свяжитесь непосредственно с пользователем.

Просто некоторые идеи ...

enter image description here

- Оригинал -

Просто несколько советов.

Мне кажется, что вам, возможно, потребуется повторно посетить схему проекта.Кажется, что таблица соискателей должна быть сводной таблицей между таблицами пользователей и заданий.Таблица пользователей и заданий имеет отношение M: M, так как многие пользователи могут обращаться ко многим заданиям, и многие пользователи могут применять ко многим заданиям.Таблица кандидатов должна выступать в качестве транзакционной таблицы, когда пользователь подает заявку на работу.

Кроме того, разве таблица резюме не должна быть напрямую связана с таблицей пользователей?Как приложение может иметь резюме?

Пользователь владеет резюме.

Пользователь относится к работе с резюме (заявитель).

1 голос
/ 07 декабря 2011

Попробуй,

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

UPDATE

Я считаю, что теперь запрос лучше:

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. Используйте функцию MAX, если вы хотите получить app.id, потому что когда вы группируете одну или несколько строк, функция max вернет правильно нужный вам идентификатор, иначе будет возвращена только первая строка, и это может быть неправильно с NULL
  2. Присоединиться к таблицам пользователей и вакансий
  3. И объединение с приложениями должно быть с id_resume и id_job
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...