Mysql 内部联接后仅返回重复记录
我有一个Mysql 内部联接后仅返回重复记录,mysql,sql,Mysql,Sql,我有一个用户表和一个电子邮件表。一个用户可以有许多电子邮件 我只想抓取那些拥有多封电子邮件的用户。以下是我到目前为止的情况: SELECT Users.name, emails.email FROM Users INNER JOIN emails On Users.id=Emails.user_id /*specify condition to only grab duplicates here */ 使用分组依据和拥有 使用分组依据和拥有 使用分组依据和拥有 使用分组依据和拥有您也可以使用C
用户
表和一个电子邮件
表。一个用户可以有许多电子邮件
我只想抓取那些拥有多封电子邮件的用户。以下是我到目前为止的情况:
SELECT Users.name, emails.email
FROM Users
INNER JOIN emails
On Users.id=Emails.user_id
/*specify condition to only grab duplicates here */
使用分组依据
和拥有
使用分组依据
和拥有
使用分组依据
和拥有
使用
分组依据
和拥有
您也可以使用CTE:
;WITH CTE AS (
SELECT Users.name, emails.email, ROW_NUMBER() OVER (PARTITION BY emails.email ORDER BY emails.email) AS 'Rank'
FROM Users
INNER JOIN emails
On Users.id=Emails.user_id)
SELECT * FROM CTE WHERE Rank > 1
您也可以使用CTE:
;WITH CTE AS (
SELECT Users.name, emails.email, ROW_NUMBER() OVER (PARTITION BY emails.email ORDER BY emails.email) AS 'Rank'
FROM Users
INNER JOIN emails
On Users.id=Emails.user_id)
SELECT * FROM CTE WHERE Rank > 1
您也可以使用CTE:
;WITH CTE AS (
SELECT Users.name, emails.email, ROW_NUMBER() OVER (PARTITION BY emails.email ORDER BY emails.email) AS 'Rank'
FROM Users
INNER JOIN emails
On Users.id=Emails.user_id)
SELECT * FROM CTE WHERE Rank > 1
您也可以使用CTE:
;WITH CTE AS (
SELECT Users.name, emails.email, ROW_NUMBER() OVER (PARTITION BY emails.email ORDER BY emails.email) AS 'Rank'
FROM Users
INNER JOIN emails
On Users.id=Emails.user_id)
SELECT * FROM CTE WHERE Rank > 1
您必须在一个单独的子查询中计算电子邮件总数,该子查询返回具有多个电子邮件的用户的用户id
SELECT users.name, emails.email
FROM users
INNER JOIN emails
ON users.id = emails.user_id
INNER JOIN (
SELECT user_id
FROM emails
GROUP BY user_id
HAVING count(*) > 1
) _cc
ON users.id = _cc.user_id;
更新:如果您只需要用户id而不需要额外的电子邮件,您可以使用此:
SELECT DISTINCT(emails.user_id)
FROM users
INNER JOIN emails
ON users.id = emails.user_id
INNER JOIN (
SELECT user_id
FROM emails
GROUP BY user_id
HAVING count(*) > 1
) _cc
ON users.id = _cc.user_id;
假设我们有以下数据:
USERS
id name
1 A
2 B
3 C
4 D
5 E
EMAILS
id user_id email
1 1 email 1
2 1 email 2
3 2 email 3
4 2 email 2
5 3 email 5
因此,使用上述数据,两个查询的结果将为:
问题1
name email
A email 1
A email 2
B email 3
B email 4
问题2
user_id
1
2
您必须在一个单独的子查询中计算电子邮件总数,该子查询返回具有多个电子邮件的用户的用户id
SELECT users.name, emails.email
FROM users
INNER JOIN emails
ON users.id = emails.user_id
INNER JOIN (
SELECT user_id
FROM emails
GROUP BY user_id
HAVING count(*) > 1
) _cc
ON users.id = _cc.user_id;
更新:如果您只需要用户id而不需要额外的电子邮件,您可以使用此:
SELECT DISTINCT(emails.user_id)
FROM users
INNER JOIN emails
ON users.id = emails.user_id
INNER JOIN (
SELECT user_id
FROM emails
GROUP BY user_id
HAVING count(*) > 1
) _cc
ON users.id = _cc.user_id;
假设我们有以下数据:
USERS
id name
1 A
2 B
3 C
4 D
5 E
EMAILS
id user_id email
1 1 email 1
2 1 email 2
3 2 email 3
4 2 email 2
5 3 email 5
因此,使用上述数据,两个查询的结果将为:
问题1
name email
A email 1
A email 2
B email 3
B email 4
问题2
user_id
1
2
您必须在一个单独的子查询中计算电子邮件总数,该子查询返回具有多个电子邮件的用户的用户id
SELECT users.name, emails.email
FROM users
INNER JOIN emails
ON users.id = emails.user_id
INNER JOIN (
SELECT user_id
FROM emails
GROUP BY user_id
HAVING count(*) > 1
) _cc
ON users.id = _cc.user_id;
更新:如果您只需要用户id而不需要额外的电子邮件,您可以使用此:
SELECT DISTINCT(emails.user_id)
FROM users
INNER JOIN emails
ON users.id = emails.user_id
INNER JOIN (
SELECT user_id
FROM emails
GROUP BY user_id
HAVING count(*) > 1
) _cc
ON users.id = _cc.user_id;
假设我们有以下数据:
USERS
id name
1 A
2 B
3 C
4 D
5 E
EMAILS
id user_id email
1 1 email 1
2 1 email 2
3 2 email 3
4 2 email 2
5 3 email 5
因此,使用上述数据,两个查询的结果将为:
问题1
name email
A email 1
A email 2
B email 3
B email 4
问题2
user_id
1
2
您必须在一个单独的子查询中计算电子邮件总数,该子查询返回具有多个电子邮件的用户的用户id
SELECT users.name, emails.email
FROM users
INNER JOIN emails
ON users.id = emails.user_id
INNER JOIN (
SELECT user_id
FROM emails
GROUP BY user_id
HAVING count(*) > 1
) _cc
ON users.id = _cc.user_id;
更新:如果您只需要用户id而不需要额外的电子邮件,您可以使用此:
SELECT DISTINCT(emails.user_id)
FROM users
INNER JOIN emails
ON users.id = emails.user_id
INNER JOIN (
SELECT user_id
FROM emails
GROUP BY user_id
HAVING count(*) > 1
) _cc
ON users.id = _cc.user_id;
假设我们有以下数据:
USERS
id name
1 A
2 B
3 C
4 D
5 E
EMAILS
id user_id email
1 1 email 1
2 1 email 2
3 2 email 3
4 2 email 2
5 3 email 5
因此,使用上述数据,两个查询的结果将为:
问题1
name email
A email 1
A email 2
B email 3
B email 4
问题2
user_id
1
2
试试这个。您正在按电子邮件分组,并显示计数大于1的邮件
SELECT Users.name, emails.email
FROM Users
INNER JOIN emails
On Users.id=Emails.user_id
GROUP BY emails.email HAVING COUNT(*) > 1
试试这个。您正在按电子邮件分组,并显示计数大于1的邮件
SELECT Users.name, emails.email
FROM Users
INNER JOIN emails
On Users.id=Emails.user_id
GROUP BY emails.email HAVING COUNT(*) > 1
试试这个。您正在按电子邮件分组,并显示计数大于1的邮件
SELECT Users.name, emails.email
FROM Users
INNER JOIN emails
On Users.id=Emails.user_id
GROUP BY emails.email HAVING COUNT(*) > 1
试试这个。您正在按电子邮件分组,并显示计数大于1的邮件
SELECT Users.name, emails.email
FROM Users
INNER JOIN emails
On Users.id=Emails.user_id
GROUP BY emails.email HAVING COUNT(*) > 1
在users.name不唯一的情况下,按users.id对_进行分组是否更好?可能有多个同名的用户。当然..这总是更好。计数聚合函数中的
distinct
有什么意义?为什么需要这样做?这是因为,如果一个用户在所有行上都有相同的电子邮件地址,此查询将不会返回该用户。因为他只有一个电子邮件id,这就是问题所在。我的问题是只抓取那些拥有多封电子邮件的用户。示例:id为1
的用户有三封电子邮件:foo@xyz.com, bar@xyz.com,及bazz@xyz.com. 我会抓住他。然而,我不会抓取id2
只有一封电子邮件的用户,或者id3
没有电子邮件的用户。在users.name不唯一的情况下,是否最好按users.id对_进行分组?可能有多个同名的用户。当然..这总是更好。计数聚合函数中的distinct
有什么意义?为什么需要这样做?这是因为,如果一个用户在所有行上都有相同的电子邮件地址,此查询将不会返回该用户。因为他只有一个电子邮件id,这就是问题所在。我的问题是只抓取那些拥有多封电子邮件的用户。示例:id为1
的用户有三封电子邮件:foo@xyz.com, bar@xyz.com,及bazz@xyz.com. 我会抓住他。然而,我不会抓取id2
只有一封电子邮件的用户,或者id3
没有电子邮件的用户。在users.name不唯一的情况下,是否最好按users.id对_进行分组?可能有多个同名的用户。当然..这总是更好。计数聚合函数中的distinct
有什么意义?为什么需要这样做?这是因为,如果一个用户在所有行上都有相同的电子邮件地址,此查询将不会返回该用户。因为他只有一个电子邮件id,这就是问题所在。我的问题是只抓取那些拥有多封电子邮件的用户。示例:id为1
的用户有三封电子邮件:foo@xyz.com, bar@xyz.com,及bazz@xyz.com. 我会抓住他。然而,我不会抓取id2
只有一封电子邮件的用户,或者id3
没有电子邮件的用户。在users.name不唯一的情况下,是否最好按users.id对_进行分组?可能有多个同名的用户。当然..这总是更好。计数聚合函数中的distinct
有什么意义?为什么需要这样做?这是因为,如果一个用户在所有行上都有相同的电子邮件地址,此查询将不会返回该用户。因为他只有一个电子邮件id,这就是问题所在。我的问题是只抓取那些拥有多封电子邮件的用户。示例:id为1
的用户有三封电子邮件:foo@xyz.com, bar@xyz.com,及bazz@xyz.com. 我会抓住他。然而,我不会抓取id2
只有一封电子邮件的用户,或者id3
没有电子邮件的用户。