gpt4 book ai didi

sql - 首先订购...然后分组

转载 作者:IT王子 更新时间:2023-10-28 23:44:24 26 4
gpt4 key购买 nike

我有两个表,一个存储用户,另一个存储用户的电子邮件地址。

  • 表用户:(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 的其他问题,但似乎没有人回答有关此查询模式的问题。

最佳答案

But this does a subquery for every row and is very inefficient

首先,您是否有一个查询计划/时间来证明这一点?您完成它的方式(使用子选择)几乎是“直观”的方式。许多 DBMS(虽然我不确定 MySQL)针对这种情况进行了优化,并且将有一种方法只执行一次查询。

或者,您应该能够创建一个仅包含 (user id, latest email id) 元组和 JOIN 的子表:

SELECT 
users.userId
, users.username
, userEmail.email
FROM users
INNER JOIN
(SELECT userId, MAX(emailId) AS latestEmailId
FROM userEmail GROUP BY userId)
AS latestEmails
ON (users.userId = latestEmails.userId)
INNER JOIN userEmail ON
(latestEmails.latestEmailId = userEmail.emailId)
ORDER BY users.username;

关于sql - 首先订购...然后分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3695502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com