【问题标题】:MySQL Joins, Group By, and Ordering the Group By ChoiceMySQL 加入、分组和按选择排序组
【发布时间】:2012-03-01 07:09:24
【问题描述】:

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

我可以通过带有表名的简单联接获得快速结果,但是“分组依据”命令为我提供了联接表的第一行,而不是最后一行。

【问题讨论】:

  • 1.) 用于订购的字段中是否有索引? 2.) 如果你在一个索引的相反方向排序,它会更慢,所以如果索引在每个案例中是升序还是降序,请谨慎选择

标签: mysql


【解决方案1】:

我不太确定你想做什么。以下是您的查询存在的一些问题:

  • 选择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`

【讨论】:

  • 当我做一个“分组依据”时,它会将许多行合并为一个。当它折叠行时,它将保留其中一行的信息——在我的情况下,它将保留的默认行不是我想要的。
  • @swt83 你误解了group by 的工作原理——你没有正确使用它,这将导致不可预测和令人沮丧的结果!请阅读它,和聚合函数,例如maxmin
  • 这是我第一次使用 joins 等经验——所以我正在努力学习。在进一步阅读时,你是对的,我在滥用这个。谢谢。
【解决方案2】:

您正在对联系人 ID 执行 LEFT JOIN,这意味着您希望所有标签联系人无论在名称表中找到匹配项。真的是这样吗,或者标签表总是有一个“姓名”联系人ID记录。此外,您的列“n.Last”。这是该人的姓氏,还是上次完成的事情(我认为实际上是时间戳)...

所以,话虽如此,我只会做一个简单的直接加入

SELECT DISTINCT
      t.contact_id, 
      n.last 
   FROM 
      tags t
         JOIN names n
            ON t.contact_id = n.contact_id 
   WHERE 
      t.tag = '$tag' 
   ORDER BY 
      n.last ASC 

【讨论】:

    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2020-02-15
    • 2021-10-14
    • 2020-05-16
    相关资源
    最近更新 更多