2012-10-10 21 views
0

我很難找到一個類似的例子,我試圖實現。我有3張桌子。從一張桌子我想獲得鏈接ID號碼。從另一張表中我想找到相同的ID,並在該表中添加另一列數字,其中第一個表的ID號匹配。然後,在第三張表格上,我要將所有文字分組在一起,其中ID與主ID號碼相匹配......並將所有這一切返回到1路。我的圖表應該說明我的意思:在mysql查詢中進行多重分組。 GROUP_CONCAT?通過...分組?內部連接?我哪裏錯了?

所以有2點的查詢會自行返回部分的結果,但是我努力將其建成1個單查詢。

SELECT ticket_charges.ticket_id 
     , sum(ticket_charges.charge_time) AS Seconds 
    FROM 
     ticket_charges 
    LEFT OUTER JOIN tickets 
    ON ticket_charges.ticket_id = tickets.id 
    GROUP BY 
     ticket_charges.ticket_id 
    , tickets.id 

門票ID 3的77和937已經正確添加!

SELECT tickets.id AS `Ticket Number` 
     , left(tickets_messages.message, 500) AS `Ticket Message` 
    FROM 
     tickets 
    INNER JOIN tickets_messages 
    ON tickets.id = tickets_messages.id 
    GROUP BY 
     tickets_messages.ticket_id 
    , tickets.id 

的消息被正確地接合在一起。

我試過上的消息有些級聯,選擇範圍內進行選擇,不同的方法來通過組,一對夫婦的款項等..但似乎仍不能由我」得到的結果,其中m將這兩個查詢作爲單個查詢正確返回結果。來自「charge_time」的加入的數字是非常錯誤的,並且不匹配任何類似的東西,或者我最終在「charge_time」上產生了數百個「消息」和奇怪的數字。如果我嘗試這樣做,我得到「子查詢返回超過1行」,但這是我認爲我應該做的。

SELECT ticket_charges.ticket_id 
     , sum(ticket_charges.charge_time) AS Seconds 
    FROM 
     ticket_charges 
    LEFT OUTER JOIN tickets 
    ON ticket_charges.ticket_id = tickets.id 
     Where (SELECT left(tickets_messages.message, 500) 
       FROM 
       tickets  
       INNER JOIN tickets_messages 
       ON tickets.id = tickets_messages.id 
       GROUP BY 
       tickets.id) 
    GROUP BY 
    ticket_charges.ticket_id 
    , tickets.id 

回答

2

如果你真正需要做的是用一個單一的查詢,解決的辦法是做一個子查詢中jointures之一。

SELECT t.id, t.person_id, SUM(tc.charge_time), mc.concat 
FROM tickets t 
INNER JOIN tickets_charges tc ON tc.ticket_id = t.id 
INNER JOIN (
    SELECT ticket_id, GROUP_CONCAT(message SEPARATOR ' ') as concat 
    FROM tickets_messages 
    GROUP BY ticket_id) AS mc 
    ON mc.ticket_id = t.id 
GROUP BY t.id 
+0

啊哈!謝謝回覆!!好吧..這是有道理的,除了我從那裏受到一個小問題,這幾乎是我見過的其他方式我試過的問題。而不是獲取單獨的行(像我的例子「我想返回的結果」在我的圖像頂部,如果這樣的話)..我實際上得到的是1行,其中所有的tc.charge_time被加起來爲1大數。如果我在tc.charge_time周圍刪除了SUM,那麼我得到的是單獨的行,並且在最後很好地將這些消息連接起來。你有什麼建議如何總結剩餘的tc.charge_time?謝謝 – Will

+0

回答更新,我的確忘記了最後的'GROUP BY' –

+0

天才!完美的作品!謝謝。 – Will

0

嘗試此查詢 -

SELECT 
    t.id, 
    t.person_id, 
    SUM(tc.charge_time) Seconds, 
    GROUP_CONCAT(LEFT(tm.message, 20)) Message 
FROM 
    tickets t 
LEFT JOIN ticket_charges ts 
    ON ts.ticket_id = t.id 
LEFT JOIN tickets_messages tm 
    ON tm.ticket_id = t.id 
GROUP BY 
    t.id; 

請注意,我用 '左(tm.message,)',因爲GROUP_CONCAT功能有長度的限制 - group_concat_max_len