我有两个表,一个存储用户,另一个存储用户的电子邮件地址。第一个命令...然后是
- 表用户:(
userId
,username
,etc
) - 表USEREMAIL:(
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的问题,但似乎没有人回答关于此查询模式的问题。
我能问你的动机是存储电子邮件的分开是什么? – RobertPitt 2010-09-12 16:11:08
您是否使用最新的emailId作为哪个电子邮件地址是用户的主要电子邮件地址的指示?这将阻止用户选择较旧的电子邮件地址作为主要电子邮件地址你有没有考虑过在users表中添加emailId? – NamshubWriter 2010-09-12 16:12:09
当用户更改他们的电子邮件地址时,新的地址被添加,旧的电子邮件地址被保留一年,然后被删除(根据规格) – Jacco 2010-09-12 16:14:57