SQL获取按第二个ID

时间:2016-05-31 14:38:46

标签: php mysql sql group-by max

我正在研究一个最好的日期检查系统之前的php / mysql,并且在创建一个新的检查时,我需要系统通过查找最近的关闭检查找到某个产品的最佳日期

我正在使用几张表来完成这项工作:

bbcheckProducts    
ID checkID productID checked bestBefore
 1       1         1       1 2015-05-06
 2       2         1       1 2016-07-22
 3       3         1       1 2016-09-16

bbChecks
checkID userID closed
      1      1      1
      2      2      1
      3      1      1

因此,当我在上图中的表格上运行此查询时:

SELECT  ID,
        MAX(checkID) AS maxCheck,
        bestBefore
FROM    bbcheckProducts
WHERE   checkID IN 
(
    SELECT  checkID
    FROM    bbChecks
    WHERE   userID = 1
    AND     closed = 1
)
AND     checked = 1
GROUP BY productID
ORDER BY bestbefore ASC

它会返回如下内容:

ID = 1
maxCheck = 3
bestBefore = 2015-05-06

所以它确实需要max checkID,但其他值仍然等于productID的第一次出现。我希望它采用与最大ID一起的值,因此结果将如下所示:

ID=3
maxCheck = 3
bestBefore = 2016-09-16

那么如何让我的查询像这样工作呢?

注意:有多种产品,因此产品1可能在支票1和3中,而产品2只在1中,因此它必须从支票1中获取产品2的数据,从支票3中获取产品1的数据

2 个答案:

答案 0 :(得分:0)

您需要在第二个表上使用max函数,例如此查询

select * from table_name where some_colomn = 'some_value' and some_colomn in (select max(some_colomn) from table_name2 where some_col = 'some_value' group by some_colomn)

答案 1 :(得分:-1)

您可以加入表格,以获得check_ID表中存在bbChecks的所有记录的简化集。 然后,您可以在简化集上运行max(CheckID) - 选择。

在你的情况下,这就像是:

SELECT ID, max(checkID), bestBefore
FROM bbcheckProducts p
INNER JOIN bbChecks c ON (p.checkID = c.checkID)
WHERE UserID = 1
AND closed = 1
AND checked = 1

这首先返回你带有checkIDs 1和3的记录。然后你选择max(checkID),所以它会返回checkID 3.