2017-02-09 20 views
0

你好我想这个查询:排序前组不给真正的结果

SELECT 
    * 
FROM 
    (
     SELECT 
      * 
     FROM 
      specials_companies_mails 
     WHERE 
      `toId` = 1 && parentId <> 0 
     ORDER BY 
      specials_companies_mails.mailId DESC 
    ) AS b 
GROUP BY 
    b.parentId 

我在表中的两行:

mailID   subject  toId  parentId 
3    test1   1   2 
4    test2   1   2 

,查询后的结果:

mailID   subject  toId  parentId 
3    test1   1   2 

其意思是

ORDER BY specials_companies_mails.mailId DESC 

不工作...它给我mailId 3和4不...

怎么办?

TNX很多

+0

这个查询是什么?你想要检索什么? – affaz

+2

您正在使用'GROUP BY b.parentId'这就是为什么只有一个记录。 –

+0

@ B.Desai我想要一个记录,但第二个...(最新) – gregory

回答

2

GROUP BY不关心ORDER BY。所选记录将完全不确定。

你可以做的是每个parentId这样找到最新mainId:如果你想那么只有最新的记录试试这个

select a.* 
from specials_companies_mails AS a 
left join specials_companies_mails AS b 
    on a.parentId = b.parentId 
    and a.mailID < b.mailID 
    and b.toId = 1 
    and b.parentId <> 0 
WHERE b.parentId is null 
    and a.toId = 1 
    and a.parentId <> 0 
+0

tnx GurV这是解决了我的问题。 – gregory

2

试试这个:

SELECT `a`.* FROM `specials_companies_mails` AS `a` 
LEFT JOIN `specials_companies_mails` AS `b` ON 
    `a`.`mailID` = `b`.`mailID` AND 
    `a`.`mailID` < `b`.`mailID` 
WHERE `b`.`mailID` IS NULL 
1

组由不关心,如果您订购的记录之前与否。它总是从保存在数据库中的第一条记录中获取信息。这是每个开发者都面临的一件痛苦的事情,所以不要担心。

您可以通过几种方法解决问题。

  1. 拆分到这2项独立的查询 - 第一个查询将ORDER BY和第二将显示您所选字段WHERE id IN (...)

  2. 加入表specials_companies_mailsspecials_companies_mails,但是这将不利于性能,是相当长。

  3. 不要编写和编写负责解析数据的代码的一部分。

1

:(我想你不需要group by子句)

SELECT * 
     FROM 
      specials_companies_mails 
     WHERE 
      `toId` = 1 && parentId <> 0 
     ORDER BY 
      mailId DESC 
     LIMIT 1 
+0

我想要一组后最新的...我举了一个2行的例子,但我有很多行... – gregory