2016-06-08 39 views
1

(以下模式已经作压缩减少的问题)MySQL的检查是否有任何行在日期未来

我有两个表Products

| ID   | ProductName  | AvailableDate (date) 
|------------------------------------------------ 
| 1   | Foo    | 2011-01-01 
| 2   | Bar    | 2017-01-01 
| 3   | FooBar   | 2011-01-01 

Mappings

| ID   | ProductID  | SomeOtherID 
|------------------------------------------------ 
| 1   | 1    | 1 
| 2   | 2    | 1 
| 3   | 3    | 2 

映射可以指向n产品:

SELECT 
    GROUP_CONCAT(`Products`.ProductName SEPARATOR ', ') 
FROM 
    Mappings 
JOIN 
    Products ON Mappings.ProductID = Products.ID 
GROUP BY 
    Mappings.SomeOtherID 

我现在想要扩展查询,以检查是否任何Products行有一个AvailableDate比当前日期现货组合产品,即至少有一个更大的“早期访问”产品。

我尝试以下

SELECT 
     GROUP_CONCAT(`Products`.ProductName SEPARATOR ', '), 
     IF(COUNT(DATEDIFF(`Products`.AvailableDate, CURDATE)) > 0, 1, 0) As IsEarlyAccess 
    FROM 
     Mappings 
    JOIN 
     Products ON Mappings.ProductID = Products.ID 
    GROUP BY 
     Mappings.SomeOtherID 

但我总是收到IsEarlyAccess = 1。任何提示?

回答

1

我会被诱惑在MAX使用IF,而不是计数的IF: -

SELECT GROUP_CONCAT(Products.ProductName SEPARATOR ', '), IF(MAX(Products.AvailableDate) > CURDATE(), 1, 0) As IsEarlyAccess 
FROM Mappings 
JOIN Products ON Mappings.ProductID = Products.ID 
GROUP BY Mappings.SomeOtherID 
+0

多谢了 - 这么简单,但如此有效!奇迹般有效 – ElGauchooo

1

您的问题奠定了这里:

 IF(COUNT(DATEDIFF(`Products`.AvailableDate, CURDATE)) > 0, 1, 0) As IsEarlyAccess 

你数是这样的:

COUNT(DATEDIFF(`Products`.AvailableDate, CURDATE)) 

这会对1的任何记录,无论结果如何,因为它将为count(4)执行等。

它改成这样:

IF(SUM(DATEDIFF(`Products`.AvailableDate, CURDATE) > 0) > 0, 1 , 0) 

这会对各1个记录,它的有效日期为更大的那么今天。

1

在MySQL中,你其实可以逃脱:

MAX(Products.AvailableDate) > CURDATE() As IsEarlyAccess 

MAX(Products.AvailableDate > CURDATE()) As IsEarlyAccess 

MySQL的需要布尔为1 true和false为0

相关问题