MySQL多对多JOIN返回重复项

时间:2019-07-12 04:56:05

标签: mysql join inner-join

我有两个三张桌子。 usersjobsusers_jobs。一个用户可以有很多工作,而一个工作可以有很多用户。

这是我的users桌子:

+----+------+--------+
| ID | Name | gender |
+----+------+--------+
|  1 | Bob  |   male |
|  2 | Sara | female |
+----+------+--------+

我的jobs表:

+----+----------+
| id |  job_id  |
+----+----------+
|  1 | Engineer |
|  2 | Plumber  |
|  3 | Doctor   |
+----+----------+

users_jobs表:

+---------+--------+
| user_id | job_id |
+---------+--------+
|       1 |      1 |
|       1 |      2 |
|       1 |      3 |
|       2 |      1 |
+---------+--------+

作为一个例子,我想选择所有男性并检查他们是否至少有一份工作,然后返回他们的信息。如果他们没有工作,则不要选择/返回该用户。这是我的查询:

SELECT * FROM users
INNER JOIN users_jobs
ON users_jobs.user_id = users.id
WHERE users.gender = 'male'

但是由于Bob有3个工作,它会返回3次Bob的信息。我不想重复,不使用DISTINCTGROUP BY怎么去除重复项,因为此处的性能非常重要。

谢谢!

3 个答案:

答案 0 :(得分:2)

MySQL允许您做一些奇怪的事情,可以选择比GROUP BY子句中更多的列和聚合函数(在大多数其他SQL引擎中不允许这样做)。尽管有时这会产生意外的结果,但如果您不选择在查询结果的多行中显示的数据,它就可以工作。

因此,对于您的问题-查询将为同一用户返回多行,因为其中一些行有很多工作(忙碌,是吗?)。通常,您无法在一行中获得所有工作,因为每一行都是用户的数据+他们的工作-这就是我们JOIN所做的。但这并非完全正确-您可以使用GROUP BYGROUP_CONCAT()将所有其他数据合并为一个字符串。我一般不会推荐它,但是如果您需要它...

SELECT u.Name, GROUP_CONCAT(j.job_id SEPARATOR ', ') as jobs
FROM users u
JOIN users_jobs uj
  ON u.ID = uj.user_id
JOIN jobs j 
  ON j.id = uj.job_id
GROUP BY u.ID

这将返回

Name    | jobs
--------+-------------------------------
Bob     | Engineer, Plumber, Doctor
Sara    | Engineer

如果只想要男性,请添加where子句,

SELECT u.Name, GROUP_CONCAT(j.job_id SEPARATOR ', ') as jobs
FROM users u
JOIN users_jobs uj
  ON u.ID = uj.user_id
JOIN jobs j 
  ON j.id = uj.job_id`
WHERE u.gender = 'male'
GROUP BY u.ID

http://sqlfiddle.com/#!9/df0afe/2观看现场小提琴

答案 1 :(得分:2)

为此,它可能会帮助您,             您可以使用“ 限制”关键字来限制获取的记录数量

"SELECT * FROM users
        INNER JOIN users_jobs
        ON users_jobs.user_id = users.id
        WHERE users.gender = 'male'" limit 1;

        May this will help you!
        Thanks!

答案 2 :(得分:0)

要继续执行注释,为了提高性能,有必要在查询中使用distinct,请尝试:

SELECT DISTINCT Name FROM users
INNER JOIN users_jobs
ON users_jobs.user_id = users.id
WHERE users.gender = 'male'

如果您希望获取所有列,但保持ID的唯一性,则可以使用GROUP BY,请尝试:

SELECT * FROM users
INNER JOIN users_jobs
ON users_jobs.user_id = users.id
WHERE users.gender = 'male'
GROUP BY users.id

尽管这也会影响性能,但这取决于您最优先考虑的事情。