MySQL通过选择加入,分组和订购组

时间:2012-02-08 19:42:02

标签: mysql

是否可以使用子查询对GROUP BY选择的MySQL查询结果进行排序?我发现,使用我的大型数据集,子查询会为查询添加大量的加载时间。

以下是类似的情况: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”命令给了我连接表的第一行,而不是最后一行。

2 个答案:

答案 0 :(得分: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`

答案 1 :(得分:0)

您正在对联系人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