2011-03-18 106 views
1

我正在寫一個查詢,應該爲每天/每月/每年多個用戶返回聚合小時數。組合SUM(),GROUP_BY()和LEFT_JOIN()返回不正確的結果:如何解決?

表看起來是這樣的:

+------------------------------------------+ 
| id | entity_id | minutes | person | date | 
+------------------------------------------+ 

如何輸出應該看:

+----------------------------+ 
| year | month | day | hours | 
| 2008 | 12 | 1 | 30 | 
| 2008 | 12 | 2 | 40 | 
| 2008 | 12 | 3 | 23 | 
+----------------------------+ 

相反,hours往往很多造成返回的行多因left join

問題是我需要根據鏈接到相應實體的標籤查詢此表。當我加入兩個表(提供鏈接的tag_entity和提供實際標記名稱的tags)時,我的SUM()不再有效,因爲返回的結果太多。

查詢:

select 
    date_format(from_unixtime(date), '%Y-%m-%d') as myDate, 
    ROUND(SUM(time)/60,1) as hours 

from time h 

left join tag_entity te on te.entity_id = h.entity_id 
left join tags t on t.tag_id = te.tag_id 

where (t.tag_name NOT IN ('foo', 'bar', 'baz') OR t.tag_name IS NULL) 

group by 
    myDate 

order by 
    hours DESC, myDate ASC 

我該如何解決這個問題?

編輯:

這裏是tagtag_entity的模式:

Tag

+----------+-------------+ 
| Field | Type  | 
+----------+-------------+ 
| tag_id | int(11)  | 
| tag_name | varchar(50) | 
+----------+-------------+ 

而且tag_entity

+-----------+---------+ 
| Field  | Type | 
+-----------+---------+ 
| id  | int(11) | 
| tag_id | int(11) | 
| entity_id | int(11) | 
+-----------+---------+ 
+0

也許我還沒有足夠的咖啡,但我無法推斷你的模式。你可以發佈標籤和tag_entity模式的相關部分嗎?另外,在哪個表中定義了「日期」和「時間」? – Andrew 2011-03-18 14:52:39

+0

@Andrew謝謝你的回覆。我添加了模式。 'date'和'time'在我的'時間表'中。 – 2011-03-18 14:58:10

+1

您正在選擇'從t'並執行'left join tag t' - 語法錯誤。你忘了把主表名稱? – 2011-03-18 15:05:46

回答

2

GROUP BY結果,沒有單獨的錶行。

基於您的評論僅在未鏈接到這些標籤的一個時間表返回行:尚未

SELECT 
    date_format(from_unixtime(date), '%Y-%m-%d') as myDate, 
    ROUND(SUM(time)/60,1) as hours 
FROM `time` h 
    LEFT JOIN (
    SELECT DISTINCT te.entity_id 
    FROM tag_entity te 
     LEFT JOIN tags t on t.tag_id = te.tag_id 
    WHERE te.entity_id IS NOT NULL AND t.tag_name IN ('foo', 'bar', 'baz') 
) g ON h.entity_id = g.entity_id 
WHERE g.entity_id IS NULL 
group by 
    myDate 

order by 
    hours DESC, myDate ASC 
+1

哇你真的釘了它。非常感謝,你剛剛度過我的週末。 – 2011-03-18 15:50:35

0
select 
    date_format(from_unixtime(date), '%Y-%m-%d') as jaar, 
    ROUND(SUM(time)/60,1) as uren 

from time h 

left join tag_entity te on te.entity_id = h.entity_id 
left join tags t on t.tag_id = te.tag_id 

where (t.tag_name NOT IN ('foo', 'bar', 'baz') OR t.tag_name IS NULL) 

group by jaar 

order by 
    uren DESC, jaar ASC 
+1

除了將日期格式更改爲一列,這不會解決任何問題。爲了簡化查詢,我將其更改爲僅返回一個日期列。 – 2011-03-18 15:14:06

+0

你測試過了嗎?這不僅僅是日期格式的變化。你所質疑的問題是,你正在按照所有年份的月份和所有月份和年份的日期分組,比如所有年份的所有janue的總和。它與左連接無關。除此之外,你是不是指'AND t.tag_name IS NOT NULL'? – 2011-03-18 15:16:58

+0

是的,我測試了它,沒有結果,悲傷。 GROUP BY子句不應按照您描述的方式工作:它將組參數組合在一起。您的示例結果完全一樣。 – 2011-03-18 15:19:40

0

也許你想是這樣的:

select 
    date_format(from_unixtime(date), '%Y-%m-%d') as myDate, 
    ROUND(SUM(time)/60,1) as hours 

from time h 

left join tag_entity te on te.entity_id = h.entity_id

where NOT EXISTS(select te.entity_id 

       from tag_entity te 

       join tags t on t.tag_id = te.tag_id 

       where te.tag_entity = h.entity_id AND t.tag_name IN ('foo', 'bar', 'baz')) 

group by 
    myDate 

order by 
    hours DESC, myDate ASC