在mysql查询中正确使用group by和order by

时间:2016-04-19 09:16:17

标签: php mysql

我试图从数据库中获取用户拥有的最新证书。我只想看到最新的,而不是所有其他的,所以我使用group by然后通过主表中的唯一ID进行排序。

没有小组这个完美的工作。我看到上传的最后一个证书,然后是下面的所有其他证书。

一旦我添加该组,我就会看到上传的第一个证书,这可能是多年前的无意义。

我的查询非常大,因为我从其他表中提取了很多其他信息。

这是我的查询。

    SELECT 
        usercert.*, 
        cert.*,
        certCat.certCatName,
        certTask.certTaskName ,
        certStatus.certStatusName 
    FROM 
        `usercert`
    INNER JOIN 
        cert 
    ON 
        cert.idcert = usercert.idcert
    INNER JOIN 
        certCat 
    ON 
        certCat.idcertCat = cert.idcertCat
    INNER JOIN 
        certTask 
    ON 
        certTask.idcertTask = usercert.idcertTask
    INNER JOIN  
        certStatus 
    ON 
        certStatus.idcertStatus =   usercert.idcertStatus
    WHERE  
        usercert.iduser=%s 
    GROUP BY 
        usercert.idcert  
    ORDER BY 
        usercert.usercertEnd DESC

2 个答案:

答案 0 :(得分:2)

SELECT 
    usercert.*, 
    cert.*,
    certCat.certCatName,
    certTask.certTaskName ,
    certStatus.certStatusName 
FROM 
    `usercert`
INNER JOIN 
    cert 
ON 
    cert.idcert = usercert.idcert
INNER JOIN 
    certCat 
ON 
    certCat.idcertCat = cert.idcertCat
INNER JOIN 
    certTask 
ON 
    certTask.idcertTask = usercert.idcertTask
INNER JOIN 
    certStatus 
ON 
    certStatus.idcertStatus = usercert.idcertSttus
WHERE  
    usercert.iduser=%s 
ORDER BY 
    usercert.usercertEnd 
DESC limit 0,1

在这个查询中,它将按降序排列所有记录,这意味着最后插入的行将首先出现,限制0,1表示它将从0开始并获取1条记录就是它...

答案 1 :(得分:1)

您可以使用MAX()

SELECT ... FROM ... WHERE ... ORDER BY MAX(usercert.usercertEnd)

LIMIT

SELECT ... FROM ... WHERE ... ORDER BY usercert.usercertEnd DESC LIMIT 1