Возможно ли это невозможный запрос MySQL? - PullRequest
4 голосов
/ 20 ноября 2010

Что у меня есть:

   SELECT jobs.id
     FROM jobs
LEFT JOIN employees_jobs
       ON employees_jobs.job_id = jobs.id
LEFT JOIN line_items
       ON line_items.job_id = employees_jobs.job_id
LEFT JOIN employee_statements
       ON line_items.employee_statement_id = employee_statements.id
    WHERE (
              employee_statements.employee_id != 17 OR
              employee_statements.employee_id IS NULL
          )
      AND employees_jobs.employee_id = 17
 GROUP BY jobs.id
 ORDER BY jobs.delivery_date ASC
  • employee_statements, много line_items (внешний ключ employee_statements_id в таблице line_items).
  • jobs также имеет множество line_items (внешний ключ job_id в таблице line_items).

(line_items в основном таблица соединения для employee_statements и jobs)

  • employees_jobs - это таблица соединений для связи «многие ко многим» между таблицей employees и таблицей jobs.
  • employee_statements принадлежат employees (внешний ключ employee_id в таблице employee_statements)

Что я пытаюсь сделать:

У меня есть сценарий, в котором заявления сотрудниковсоздан с позициями.Эти позиции ссылаются на выполненные задания.На каждую работу может быть назначено несколько сотрудников.

Допустим, у нас есть сотрудник с id = 17.Я хочу получить все вакансии, которые еще не были связаны с позицией ни в одном из его предыдущих отчетов о сотрудниках.

Итак, все они будут включены в результаты:

  1. Все задания, над которыми работал сотрудник 17, не связаны с позицией.
  2. Все задания, над которыми работал сотрудник 17, были связаны с позицией в выписке другого сотрудника.

Таким образом, если сотрудник 17 и сотрудник 14 работали на одной и той же работе, и в одном из утверждений сотрудника 14 уже есть позиция для этой работы (но в отчетах сотрудника 17 нет этой позиции), задание должно отображаться врезультат моего запроса.

Где я в тупике:

Приведенный выше запрос возвращает все задания, над которыми работал сотрудник 17, независимо от того, были ли они назначены на чью-либо строку.

Я понимаю, почему.

В условной логике я проверяю, есть ли employee_statements.employee_id IS NULL.Это возвращает задания, которых нет ни в одном утверждении.

Я также проверяю на employee_statements.employee_id != 17.Это для заданий, которые указаны в отчетах других сотрудников.

Таким образом, по сути, я получаю все задания, над которыми он работал, в результате, независимо от того, назначил ли он одно себе (потому что если другой сотрудникесли это назначено, второе условие захватывает это).Я не могу понять, как сказать это, чтобы вернуть только те работы, которые я хочу.(это был долгий день.;))

Ответы [ 2 ]

3 голосов
/ 20 ноября 2010

У меня тоже долгий день, поэтому я могу что-то упустить, но как насчет этого:

2 голосов
/ 20 ноября 2010

Я не совсем понимаю, что вы хотите, но разве вы не должны начинать с чего-то вроде:

(employee_statements.employee_id = 17 AND
/* SOME QUERY HERE TO DETERMINE IF NOT ASSOCIATED */)
OR
(employee_statements.employee_id = 17 AND
/* SOME QUERY HERE TO DETERMINE IF ASSOCIATED WITH OTHER EMPLOYEE STATEMENT */ )

Трудно сказать, что именно происходит, и здесь тоже был длинный день, но вы, вероятно, могли бы получить это сейчас:)

Похоже, вам понадобится второй запрос, поскольку он только возвращает задания, связанные с сотрудником 17, в первую очередь ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...