好吧,标题看起来似乎很混乱,但是-我需要根据每个用户的电子邮件从SQL数据库中选择一个字段。关键是-每个用户可能多次出现,所以查询很简单
Select Table.Field From Table Where Table.Email='email@email.com'
可能返回该字段的多行(不要问我为什么,我没有设计系统)。
如果我收到多个Table.Email
的请求,哪种方法更好?
Select Table.Field From Table
Where Table.Email='email@email.com'
or
Table.Email='email2@email.com'
or
Table.Email='email3@email.com'
or
...
然后遍历所有结果并控制每个Table.Field
的{{1}}值是什么?
Table.Email
因此,选择的内容将与我收到的电子邮件一样多。
谢谢您的输入。
答案 0 :(得分:0)
您的问题很难解析。
例如,您说您可能会为“字段”(列)获得多行。但是,这些行中每一行的列值可以不同吗?如果是这样,该如何确定所需的值?
select table.email, max(table.column) from table where table.email in ('email1', 'email2', ...) group by table.email?
select table.email, min(table.column) from table where table.email in ('email1', 'email2', ...) group by table.email ?
如果您要执行的操作是根据每个电子邮件参数为“字段”获取单个值,那么您提出的解决方案都无法解决上述问题。
答案 1 :(得分:0)
您必须使用IN
子句来过滤多个值,
Select Table.Field From Table Where Table.Email in ('email@email.com' ,
'email2@email.com' , 'email3@email.com , ....)
OR
仅在过滤满足多个条件之一或多个条件的值时可用。
答案 2 :(得分:0)
通常,最好在数据库中而不是在应用程序中进行批量处理。原因很简单:每个查询都有自己准备查询和返回结果的开销。多个查询使这一开销成倍增加。
第二,如果分别查询每封电子邮件,则冒着为每封电子邮件返回多行的风险-除非结构合理。在SQL本身中,您可以使用汇总,row_number()
或类似机制将结果限制为每封电子邮件一个。例如:
select email, field
from (select t.*,
row_number() over (partition by email order by createdAt desc) as seqnum
from t
where email in (< emails you want here >)
) t
where seqnum = 1;
在某些情况下,您可能希望分别获取每封电子邮件。例如,如果您在每行上分别运行一项昂贵的操作(例如发送电子邮件),则可能需要交错操作。在这种情况下,“批量”查询需要处理更多的数据,因此会产生更多开销,因此通过查找一封电子邮件可以更快地获得第一个结果。
但是,一般规则是让数据库对数据做尽可能多的工作以适合数据库。