2013-05-29 290 views
1

背景...MySQL查詢返回錯誤的結果

我想查詢數據庫,看看有什麼出租物業,我們在指定日期範圍內可用。存儲方法非常糟糕,但它是由桌面程序創建的:/ 該網站是用Wordpress編寫的,但即使手動查詢數據庫,我甚至無法獲得正確的結果。

問題... 數據庫中有3列:propid,av_dateavail。我有一個房產,預訂於5月31日和6月8日,但每天之間可用。當我在表中查看數據時,它看起來是這樣的:

propid av_date  avail 

1051  2013-05-31 U 
1051  2013-06-01 A 
1051  2013-06-02 A 
1051  2013-06-03 A 
1051  2013-06-04 A 
1051  2013-06-05 A 
1051  2013-06-06 A 
1051  2013-06-07 A 
1051  2013-06-08 U 

當我運行下面的查詢中,該酒店仍然顯示...

SELECT DISTINCT propid 
FROM availabilities 
WHERE avail = 'A' 
AND av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08'); 

我一直在打我的頭靠在牆上2天以上,所以這可能是愚蠢的,但任何幫助將不勝感激!

+0

您的預期成果是什麼? – Ochi

+0

「av_date IN(....)」只需要一次命中即可通過。那是哪裏問題是.. – Johan

+0

你是什麼意思「物業仍然顯示」?我希望你的查詢能夠獲得'avail ='a'' *和*'av_date'在日期列表中的所有行。對於您的示例數據,恰好是'avail ='A''的所有行。你想要什麼結果? –

回答

1

如果要完全排除該財產,如果它的日期範圍有一個avail = 'U',試着數爲U發生和漏報任何一個有至少一個U

SELECT propid 
FROM availabilities 
WHERE av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08') 
GROUP BY propid 
HAVING COUNT(CASE WHEN avail = 'U' THEN 1 END) = 0 

最後,你可以使用範圍與BETWEEN的日期,這使得查詢更短,更易於維護:

SELECT propid 
FROM availabilities 
WHERE av_date BETWEEN '2013-05-31' AND '2013-06-08' 
GROUP BY propid 
HAVING COUNT(CASE WHEN avail = 'U' THEN 1 END) = 0 
+0

這就是我錯過的!謝謝! –

0

嘗試:

SELECT propid, avail, av_date 
FROM availabilities 
GROUP BY propid HAVING avail = 'A' 
AND av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08'); 
+0

'選擇不同'與單個字段在功能上與該字段上的正常查詢分組相同。除了語法之外,你什麼也沒有改變。 –

0

您可以使用排除propids任何不可用NOT EXISTS:

SELECT DISTINCT a.propid 
FROM availabilities a 
WHERE NOT EXISTS 
(SELECT 1 
FROM availabilities b 
WHERE b.avail = 'U' 
AND b.propid = a.propid 
AND b.av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08'); 
) 

子查詢可以包括從可用性一個基於價值觀的條件。

0

您的查詢發現,可在任何屬性日期爲。爲了獲得所有的日期,你有一個集合內的問題。我發現最好的方法是使用having子句進行聚合。

SELECT propid 
FROM availabilities 
group by propid 
having sum(case when av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08') and 
        avail <> 'A' 
       then 1 
       else 0 
      end) > 0 

having條款計算行數中條件如此。如果有,則不包括該物業。您也可以這樣做:

SELECT propid 
FROM availabilities 
group by propid 
having sum(case when av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08') and 
        avail = 'A' 
       then 1 
       else 0 
      end) = 9; 

9是您的設置中的日期數。