MySQL 连接、分组依据以及按选择排序分组

标签 mysql

是否可以不使用子查询对 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/

相关文章:

mysql - 简单的多对多关系

mysql - 删除 MySQL 中的重复条目

MySQL 查询 - 计算不引用自身的记录数

php - 如何正确从mysql底部轴上获取时间序列数据

php - MySQL多对一关系

mysql - 插入 othertbl SELECT * tbl

mysql - 使用 MySql 与 json 文件作为 python telegram bot 的用户数据库

MYSQL PHP 查询 : Joining on more than one field

mysql - CakePHP - 获取最后一个查询运行

php - 让密码更安全?