【发布时间】:2010-09-12 15:59:28
【问题描述】:
我有两张表,一张存储用户,另一张存储用户的电子邮件地址。
- 表用户:(
userId,username,etc) - 表用户邮箱:(
emailId,userId,email)
我想做一个查询,以获取最新的电子邮件地址以及用户记录。
我基本上是在寻找这样的查询
FIRST ORDER BY userEmail.emailId DESC
THEN GROUP BY userEmail.userId
这可以通过:
SELECT
users.userId
, users.username
, (
SELECT
userEmail.email
FROM userEmail
WHERE userEmail.userId = users.userId
ORDER BY userEmail.emailId DESC
LIMIT 1
) AS email
FROM users
ORDER BY users.username;
但这对每一行都进行子查询,效率非常低。 (在我的程序逻辑中执行 2 个单独的查询并将它们“加入”在一起会更快)。
为我想要的内容编写的直观查询是:
SELECT
users.userId
, users.username
, userEmail.email
FROM users
LEFT JOIN userEmail USING(userId)
GROUP BY users.userId
ORDER BY
userEmail.emailId
, users.username;
但是,这并不能如我所愿。 (GROUP BY是在排序之前进行的,所以ORDER BY userEmail.emailId无关)。
所以我的问题是:
是否可以在不使用子查询的情况下编写第一个查询?
我已经搜索并阅读了有关 stackoverflow 的其他问题,但似乎没有人回答有关此查询模式的问题。
【问题讨论】:
-
我能问一下您单独存储电子邮件的动机是什么?
-
您是否使用最新的 emailId 来指示哪个电子邮件地址是用户的主电子邮件地址?这将阻止用户选择较旧的电子邮件地址作为主要地址。您是否考虑过将 emailId 添加到 users 表中?
-
当用户更改邮箱地址时,添加新地址,旧邮箱地址保留一年后被删除(根据规范)
-
我猜查询可以通过适当的表格设计变得更有效和更有意义。
-
@NamshubWriter,我已经考虑过了,但它会创建一个我想阻止的循环引用。另外,我在其他情况下也有上述问题,所以我想学习一般情况下的最佳解决方案。