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

时间:2012-05-16 15:00:30

标签: php 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的任何回复..

我哪里出错?

注意,我不想将我的结果分组,然后订购它们。

我希望他们被订购,然后分组。分组后..我希望每个组的结果具有最高值..来自组中的其他行

5 个答案:

答案 0 :(得分:1)

首先执行排序是不够的,因为即便这样,MySQL也不保证它将为每个组选择哪条记录。来自the manual

  

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

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

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')

答案 1 :(得分:0)

按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

答案 2 :(得分:0)

当您使用某些聚合函数(sum,max,min,count等)时,通常会使用分组。如果您在查询中未使用此类函数,那么为什么要对结果进行分组?

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

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

答案 3 :(得分:-1)

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

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

答案 4 :(得分:-1)

我发现你的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