是否可以不使用子查询对 MySQL 查询的 GROUP BY 选择结果进行排序?我发现,对于大型数据集,子查询会为我的查询增加大量加载时间。
这里有一个类似的情况:how to sort order of LEFT JOIN in SQL query?
这是我的代码,可以工作,但加载时间太长:
SELECT tags.contact_id, n.last
FROM tags
LEFT JOIN ( SELECT * FROM names ORDER BY timestamp DESC ) n
ON (n.contact_id=tags.contact_id)
WHERE tags.tag='$tag'
GROUP BY tags.contact_id
ORDER BY n.last ASC;
通过表名进行简单的联接,我可以快速获得结果,但是“group by”命令为我提供了联接表的第一行,而不是最后一行。
最佳答案
我不太确定你想做什么。以下是您的查询存在的一些问题:
- 选择
n.last
,尽管它既不在group by
子句中,也不是聚合值。尽管 MySQL 允许这样做,但利用它确实不是一个好主意。 - 在连接之前无需对表进行排序,而不仅仅是连接
- 子查询实际上并没有做任何事情
我建议仔细写下所需的查询结果,即“我想要每个标签的联系人 ID 和最新日期”或类似的内容。这可能会产生一个自然、易于编写且语义正确的查询,而且比您在 OP 中显示的更有效。
<小时/>要回答“是否可以订购 GROUP BY 查询”的问题:是的,这很简单,下面是一个示例:
select a, b, sum(c) as `c sum`
from <table_name>
group by a,b
order by `c sum`
关于MySQL 连接、分组依据以及按选择排序分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9200266/