2011-09-05 272 views
8

我需要做GROUP BYORDER BY。我不明白为什么MySQL不支持。 这是我的代码:GROUP BY后ORDER BY

SELECT 
    `pages`.`id`, 
    `contents`.`id_language`, 
    [...] 

[...] 

ORDER BY 
    FIND_IN_SET(`languages`.`id`, '3') DESC 

[the GROUP BY] 

结果将是这样的:

id | id_language | ... 
1 3 
1 1 
2 3 
2 5 
2 1 

我需要按ID,我只需要在第一个结果,我需要在一个视图中进行保存。因为这个,我无法使用SUBQUERY。

结果必须是:

id | id_language | ... 
1 3 
2 3 

注意:不要被迷惑id_language = 3,因为它不是一个规则。

回答

1

分组依据将分组结果集,通常用于聚合。 Order By是排序结果的方式。

+0

所以我不能用GROUP BY为这种情况? –

1

您可能需要在原始查询中添加一个GROUP BY的附加列,以及您目前正在分组的任何列。该列在分组时可用于后续订购。例如:

SELECT 
    SUM(IF(`languages`.`id` = 3, 1, 0)) AS languageOrder, 
    `pages`.`id`, 
    `contents`.`id_language`, 
    [...] 

[...] 

[GROUP BY...] 

ORDER BY languageOrder DESC 

我打算让languageOrder对包含语言#3的组为正,否则为0。因此包含语言3的组将位于顶部。

+0

ORDER BY正常工作,问题是我只需要找到每个ID的第一个值。 –

+0

所以如果我理解正确,你真正想要的是对于每个组,你想要返回哪一行有3个language_id。如果只有一行(或没有)有一个3,那么你可以做WHERE language_id = 3.如果可以有多个,那么SQL如何决定向你展示哪一个? –

+0

Nop ...结果就像'1 | 3','1 | 5','2 | 2','2 | 5',例如...我需要得到,对于每个ID,第一次找到ROW ...所以,这个例子的结果只是'1 | 3'和'2 | 2'。 –

0

非常有趣,尝试

select * from your_table 
where id_language=3 
order by id; 

据我所知道的,规则集id_language=3
这使得没有区别使用where

7
SELECT id, idl 
FROM (SELECT 
    `pages`.`id` as id, 
    `contents`.`id_language` as idl, 
    [...] 

[...] 

ORDER BY 
    FIND_IN_SET(`languages`.`id`, '3') DESC 
    ) d 
GROUP BY d.id