我有一个requests
和一个results
表。每个都有一个email_sha256
列。
请求可能包含具有相同电子邮件的多行,而电子邮件在结果中是唯一的。结果表中的电子邮件可能不存在于请求表中。
我想获得100个结果,并且请求表中存在一封电子邮件:
SELECT results.* FROM results
INNER JOIN requests ON results.email_sha256 = requests.email_sha256
LIMIT 100
这通常有效,但是如果有多个请求使用同一封电子邮件,它可能会多次返回相同的结果。 有什么方法可以确保我获得100个唯一结果而不是重复结果?
连接似乎很慢。有没有更好的方法来获得期望的结果。例如使用EXISTS
?
答案 0 :(得分:0)
通常可以,但是如果有多个请求使用相同的电子邮件,则可能会多次返回相同的结果。有什么方法可以确保我获得100个唯一的结果,而不是重复的结果?
使用GROUP BY
Docs。
SELECT results.* FROM results
INNER JOIN requests ON results.email_sha256 = requests.email_sha256
GROUP BY results.email_sha256
LIMIT 100
加入似乎很慢。有没有更好的方法来获得期望的结果。例如使用EXISTS吗?
没有an explanation和/或information about the table(s),我们无法具体回答。但是,最可能的答案是您没有索引正确的列。
您应该在JOIN
ing列和GROUP BY
列上建立索引。在这种情况下,相同-results.email_sha256
和requests.email_sha256
。
这是一个好的开始,关于MySQL缓慢返回结果的各种问题,Stack Overflow也有很多更具体的问答。...
答案 1 :(得分:0)
具有EXISTS:
SELECT r.* FROM results r
WHERE EXISTS (
SELECT 1 FROM requests WHERE email_sha256 = r.email_sha256
)
LIMIT 100
由于结果中email_sha256
是unique
,因此该方法返回100个唯一行。