2015-05-29 3 views
0

В следующем запросе я собираю список претендентов на конкретную работу. Независимо от того, что я GROUP BY, он либо дает мне одного и того же пользователя, но с каждой другой информацией приложения, или я получаю 4 строки, возвращенные для каждого.GROUP BY, что приводит к нежелательным результатам

Я только начал заниматься реляционным дизайном базы данных, поэтому я предполагаю, что это неправильно. Я расстался с претендентами и приложениями, и теперь я борюсь с группировкой данных. Если мне просто нужен подзапрос, group_concat, или я просто использую GROUP BY неправильно?

SELECT 
    applicants.*, applications.*, users.* 
FROM applicants 
    INNER JOIN applications ON applicants.job_id = applications.job_id 
    INNER JOIN users ON applicants.user_id = users.user_id 
WHERE 
    applicants.job_id = 56 AND applicants.process_level = 1 
GROUP BY applications.app_id 

Таблица: Заявители

+-----+--------+---------+--------+--------------------+---------------+ 
| id | job_id | user_id | app_id |   applied_on | process_level | 
+-----+--------+---------+--------+--------------------+---------------+ 
| 1 |  56 |  125 |  5 |2015-05-24 19:28:55 |    1 | 
| 2 |  22 |  15 |  6 |2015-05-25 16:38:24 |    2 | 
| 3 |  56 |  100 |  7 |2015-05-26 13:38:24 |    1 | 
+-----+--------+---------+--------+--------------------+---------------+ 

Таблица: приложения

+---------+--------+---------+--------------+-------------+ 
| app_id | job_id | user_id | experience | location | 
+---------+--------+---------+--------------+-------------+ 
|  5 |  56 |  125 | bibendum jus |  suscipi | 
|  6 |  22 |  15 | Morbi vitae |  aliquet | 
|  7 |  56 |  100 | Duis et ex a | convallis | 
+---------+--------+---------+--------------+-------------+ 

Таблица: пользователи

+---------+-----------------+------------+-----------+ 
| user_id |  user_email | first_name | last_name | 
+---------+-----------------+------------+-----------+ 
|  15 | [email protected] |  Joe | Shcomo | 
|  100 | [email protected] |  Sally |  Smith | 
|  125 | [email protected] |  John |  Doe | 
+---------+-----------------+------------+-----------+ 

желаемого результата: например, Я хочу одну строку для пользователя 125, где job_id - 56, со всеми их данными от заявителя, приложений и пользователя. (не все данные, представленные конечно):

+---------+------------+-----------+---------------+---------------------+ 
| user_id | first_name | location | process_level |   applied_on | 
+---------+------------+-----------+---------------+---------------------+ 
|  125 |  John | suscipi |    1 | 2015-05-24 19:28:55 | 
|  100 |  Sally | convallis |    1 | 2015-05-26 13:38:24 | 
+---------+------------+-----------+---------------+---------------------+ 
+0

Возможно, вам вообще не нужна группа. –

+2

'Заявители. *, Приложения. *, Пользователи. *', Что не подходит для 'GROUP BY', и поскольку вы не запрашиваете каких-либо суммарных значений, вам не нужна группировка –

+2

Возможно, я пропустил это, но Я не уверен, что вы действительно говорите, что вы пытаетесь сделать. –

ответ

1

Во-первых, записку о нормализации: вы не должны хранить job_id и user_id в обоих заявителей и таблице приложения. Вероятно, вам нужны только они в таблице «приложение», так как я могу перейти от заявки «Заявитель =>», чтобы определить эту информацию. Сохраняя эти отношения в двух таблицах, вы открываете себя для аномалий, которые вам не нравятся.

Это, как говорится, вам не нужно группировать ничего. Существует постоянная связь между пользователями и приложениями, которые вы можете получить с помощью JOIN, которые у вас уже есть. Я укрепил их присоединяется с помощью user_id, job_id и APP_ID столбцы, которые связаны между applications и applicants:

SELECT u.user_id, u.first_name, a.location, ap.process_level, ap.applied_on 
FROM users u 
JOIN applications a ON a.user_id = u.user_id 
JOIN applicants ap ON ap.user_id = a.user_id AND ap.app_id = a.app_id AND ap.job_id = a.job_id 
WHERE ap.job_id = 56 AND ap.process_level = 1; 

Это работало большой в SQL Fiddle.

+0

Это имеет полный смысл - и работает как шарм. Спасибо за вашу помощь. – Klav

Смежные вопросы