是否可以使用子查询对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”命令给了我连接表的第一行,而不是最后一行。
答案 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