2012-01-09 91 views
0

稱爲「報告」 A表:如何在日期存儲在單獨的行中時創建日期範圍查詢?

|id|report_field_id|report_value_row_id|report_value| 
|1|1|1|2012-01-05| 
|2|2|1|Some text| 
|3|3|1|109.00| 
|4|1|2|2012-01-06| 
|5|2|2|More text| 
|6|3|3|889.73| 
|7|1|3|2012-01-07| 
|8|2|3|More text| 
|9|3|3|889.73| 

我想創建求和report_value其中report__field_id等於將選擇查詢3和其中report_field_id 1是在特定日期或特定日期範圍之間。我不確定我是否應該使用子查詢,加入或什麼。我對MySQL仍然很陌生,但我真的需要這個爲我正在開發的項目工作。

+0

這個表的設計完全不合情理。爲什麼它首先是這樣設計的? – JM4 2012-01-09 20:17:21

+0

因爲我們的應用程序不確定需要多少個字段和哪些數據類型。 – jnthnclrk 2012-01-09 20:40:10

回答

1

好吧,讓我們試試這個:

select 
    sum(r.report_value) as value 
from 
    report r 
where 
    r.report_field_id = 3 
    and exists 
    (
     select 
      1 
     from 
      report r1 
     where 
      r1.report_value_row_id = r.report_value_row_id 
      and str_to_date(report_value, '%Y-%m-%d') between '2012-01-04' and '2012-01-05' 
      and r1.report_field_id = 1 
    ) 

這個查詢是說,你的表的設計是相當糟糕的。你爲什麼不只是有日期,名稱和價值的列?這樣,你可以做select sum(value) from report where date between '2012-01-04' and '2012-01-05',讓你的生活變得輕鬆!我會真誠地質疑你的數據庫設計實踐。這是一個關係數據庫,而不是一個關鍵值存儲 - 使用它就像一個。

+0

感謝您的回答,這感覺就像我需要的東西。然而你的代碼給了我一個空返回。我猜你還犯了一​​個錯字;不應該「報告r1」是「報告r1」,假設我的表被稱爲報告? – jnthnclrk 2012-01-09 20:09:38

+0

表格是這樣設計的,因爲我們的應用程序無法確定我們將在給定報告中使用多少個字段。他們改變數量和數據類型。 – jnthnclrk 2012-01-09 20:10:23

+0

發現了另一個錯字,一旦修復,它就會按預期工作。 「%Y-%M-%d」應該是「%Y-%m-%d」。感謝您的幫助!您的答案是一個子查詢的例子嗎? – jnthnclrk 2012-01-09 20:23:47