我有两个三张桌子。 users
,jobs
和users_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的信息。我不想重复,不使用DISTINCT
或GROUP BY
怎么去除重复项,因为此处的性能非常重要。
谢谢!
答案 0 :(得分:2)
MySQL允许您做一些奇怪的事情,可以选择比GROUP BY
子句中更多的列和聚合函数(在大多数其他SQL引擎中不允许这样做)。尽管有时这会产生意外的结果,但如果您不选择在查询结果的多行中显示的数据,它就可以工作。
因此,对于您的问题-查询将为同一用户返回多行,因为其中一些行有很多工作(忙碌,是吗?)。通常,您无法在一行中获得所有工作,因为每一行都是用户的数据+他们的工作-这就是我们JOIN
所做的。但这并非完全正确-您可以使用GROUP BY
和GROUP_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
答案 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
尽管这也会影响性能,但这取决于您最优先考虑的事情。