Mysql 排序,然后在 mysql 中对查询进行分组


Mysql ordering and then grouping a query in mysql

我需要先按日期对查询进行排序...

所以我用了这个:

SELECT * FROM `mfw_navnode` order by `id` DESC

我想从最后到第一个对结果进行排序。

那我想做什么

是在其上添加一个查询,这将按node_name对我的结果进行分组。

结果应该是..所有顶级节点都按"类别/节点名称类型"分组,而我看到的第一个节点在第一次查询中按其类别排序最高。

我想做这样的事情:

SELECT * FROM( 
SELECT * FROM `mfw_navnode` order by `id` DESC) AS DD
WHERE (node_name='Eby' OR node_name='Laa'  OR node_name='MIF' OR node_name='Amaur' OR node_name='Asn' )
GROUP BY DD.node_name

我没有得到任何结果..或当我输入该结果时来自phpmyadmin的任何响应。

我哪里出错了?

注意,我不想对我的结果进行分组然后对它们进行排序。

我希望对它们进行排序,然后分组。分组后..我希望每个组的结果具有最高值..从组中的其他行

首先执行排序是不够的,因为即使这样,MySQL也不能保证它将为每个组选择哪个记录。 从手册:

服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则选择的值是不确定的。

相反,您必须使用子查询标识感兴趣的记录,然后再次将结果与表联接,以获取相关值:

SELECT *
FROM   mfw_navnode NATURAL JOIN (
         SELECT node_name, MAX(id) AS id FROM mfw_navnode GROUP BY node_name
       ) AS DD
WHERE  node_name IN ('Eby', 'Laa', 'MIF', 'Amaur', 'Asn')

ID 排序,按node_name分组

SELECT * FROM `mfw_navnode`
WHERE (node_name='Eby' OR node_name='Laa'  OR node_name='MIF' OR node_name='Amaur' OR node_name='Asn' )
GROUP BY DD.node_name
ORDER BY `id` DESC

当您使用某些聚合函数(总和、最大值、最小值、计数等)时,通常使用分组。如果您在查询中不使用此类函数,那么为什么要对结果进行分组?

无论如何,这应该可以解决问题:

SELECT *
FROM mfw_navnode
WHERE id IN (SELECT id
    FROM mfw_navnode
    WHERE node_name IN ('Eby', 'Laa', 'MIF', 'Amaur', 'Asn')
    GROUP BY node_name)
ORDER BY id

以下 SQL 可能会生成所需的输出:

SELECT node_name, MAX(id)
FROM mfw_navnode
GROUP BY node_name
ORDER BY node_name

我看到你的SQL有两个问题。

1) 在内联选择中下订单没有任何作用(并且可能导致错误)2)您正在分组node_name但您没有聚合任何内容

SELECT COUNT(id) as row_count, node_name FROM( SELECT * FROM mfw_navnode ) AS DD
WHERE (node_name='Eby' OR node_name='Laa'  OR node_name='MIF' OR node_name='Amaur' OR node_name='Asn' )
GROUP BY DD.node_name
order by node_name desc

此外,我不确定为什么您需要内联选择,因为位置可能只是在原始选择上(也许您有一些更复杂的事情没有显示)

SELECT COUNT(id) as row_count, node_name 
from mfw_navnode
WHERE node_name='Eby' OR node_name='Laa'  OR node_name='MIF' OR node_name='Amaur' OR node_name='Asn' 
GROUP BY node_name
order by node_name desc