当前位置: 首页 > 面试题库 >

第一次订购-然后是GROUP BY

宋飞文
2023-03-14
问题内容

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

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


问题答案:

但这对每一行都执行子查询,并且效率很低

首先,您是否有一个证明这一点的查询计划/时间安排?您完成操作的方式(使用子选择)几乎是执行操作的“直观”方式。许多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 Server 2008查询,以便可以根据需要循环遍历输出和输出标头。我已经多次以错误的方式完成了这些工作,并让ColdFusion在页面中进行了艰苦的工作,但是需要在SQL Server中完成。 我希望查询结果集如下所示: 如果ParentID为0,则表示它是主要类别。如果ParentID大于0,则表示它是次要类别,是父级的子级。 因此,父母需要订购A-

  • 问题内容: 我是Angular.js的新手,在排序数组和处理排序后的数据时遇到一些问题。 我有一个包含项目的列表,并希望按“ Store.storeName”对其进行排序,到目前为止,该列表仍然有效。但是在对数据排序之后,我的删除功能不再起作用。我认为那是因为排序后$ index错误,因此删除了错误的数据。 我该如何解决?在范围内而不是在视图中排序数据?怎么做? 这是一些相关的代码: 在视图中:

  • 昨天面试了新华三的远程技术支持岗位 流程是这样: 1.自我介绍 2.问在校学分绩点,专业排名 3.问四六级是否有,多少分,还要不要刷分 4.根据简历里面校园经历提问,比如策划活动如何策划的,开讲座的主讲人和主讲内容是不是自己 5.根据简历里面写的专业技能提问专业性问题 6.反问环节 不足: 1.自我介绍有待加强,感觉没有重点 2.反问环节太莽撞了,什么都问显得不是很专业,显得很愚蠢,没有用心准备

  • 问题内容: 我有一个要排序的对象数组,每个对象都有两个参数:强度和名称 我想先按强度排序,然后再按字母顺序排序。我正在使用以下代码对第一个参数进行排序。然后如何排序? 谢谢你的帮助。 问题答案: 这样扩展您的排序功能; 一个和比较对字符串 是 字母比较。

  • fileInput包含一个大约30行的csv文件,我只想访问第二行。 我需要访问第二行而不是第一行(第一行包含列名称)<代码>行[1]给出了

  • 问题内容: 我有一个与数据库对话的servlet,然后返回一个有序(按时间排序)对象的列表。在servlet部分,我有 从日志中,我可以看到数据库以正确的顺序返回了User对象。 在前端,我有 但是顺序改变了。 我只在返回的列表很大(超过130个用户)时才注意到这一点。 我尝试使用Firebug进行调试,Firebug中的“响应选项卡”显示列表的顺序与servlet中的日志不同。 我做错了什么吗?