GROUP BY导致不良后果

时间:2015-05-29 13:43:50

标签: mysql group-by

在以下查询中,我正在提取特定工作的申请人列表。无论我是GROUP BY,它要么给我相同的用户,但每个不同的应用程序数据,或者每个返回4行。

我刚刚开始进入关系数据库设计,所以我假设我设置错了。我将申请人和申请分开了,现在我正在努力将数据分组。除非我只需要一个子查询,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 |  joes@email.com |        Joe |    Shcomo |
|     100 | sally@email.com |      Sally |     Smith |
|     125 | johnj@email.com |       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 |
+---------+------------+-----------+---------------+---------------------+

1 个答案:

答案 0 :(得分:1)

首先,关于规范化的说明:您不应该在申请人和申请表中存储job_id和user_id。可能,你只需要在'应用'表中,因为我可以从申请人=>申请确定该信息。通过将这些关系存储在两个表中,您可以打开自己不喜欢的异常情况。

话虽如此,你不需要任何分组。您可以使用JOIN已经获得的用户和应用程序之间存在一致的关系。我通过使用applicationsapplicants之间相关的user_id,job_id和app_id列来加强了这些联接:

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中效果很好。