2016-06-08 78 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

相關問題