2015-01-13 89 views
1

我有2個表,TaskTransaction,它看起來像這樣:多個內部連接 ​​- MySQL的

任務

enter image description here

交易

enter image description here

我想創建一個從兩個表中返回信息的查詢。

色譜柱:name, priority, waiting, error, done, total, status

其中:

  • 名稱= Task.name
  • 優先= Task.priority
  • 等待=計數(transaction.id)WHERE task.id =事務。任務和transaction.status = 1
  • error = count(transaction.id)WHERE task.id = transaction.task and transaction.status = 2
  • 做=計數(transaction.id)WHERE task.id = transaction.task和transaction.status = 3
  • 總=計數(transaction.id)WHERE task.id = transaction.task
  • 狀態=任務。狀態

INNER試圖加入,但我得到一個錯誤的結果:

SELECT tk.name, tk.priority, waiting.waiting, error.error, done.done, total.total 
    FROM task AS tk, transaction AS tran 
    INNER JOIN (
    SELECT count(id) AS waiting 
    FROM transaction 
    WHERE status = 1 
) AS waiting 
    INNER JOIN (
    SELECT count(id) AS error 
    FROM transaction 
    WHERE status = 3 
) AS error 
    INNER JOIN (
    SELECT count(id) AS done 
    FROM transaction 
    WHERE status = 4 
) AS done 
    INNER JOIN (
    SELECT count(id) AS total 
    FROM transaction 
) AS total; 

能否請你幫我創造這個查詢?我得到了等待的列,錯誤,完成,總數與所有交易的計數。相反,它應該獲得交易數量WHERE task.id = transaction.task和transaction.status = 1,2,3。

+0

什麼是錯誤的結果,你得到什麼? – skrrgwasme

+0

列等待,錯誤,完成,總計獲得所有交易的計數數量。對於每個任務,它應該獲得事務號WHERE task.id = transaction.task和transaction.status = 1,2,3。 – Romulus

回答

0

您現有查詢存在一些問題。首先,你沒有在任何欄目中將你的兩個表格連在一起。看起來你可以加入task.idtransaction.task。第二。你應該能夠通過使用聚合函數一些有條件的邏輯讓每一個總的,就像一個CASE表達式:

SELECT tk.name, tk.priority, 
    sum(case when tran.status = 1 then 1 else 0 end) waiting, 
    sum(case when tran.status = 3 then 1 else 0 end) error, 
    sum(case when tran.status = 4 then 1 else 0 end) done, 
    count(*) total 
FROM task AS tk 
INNER JOIN transaction AS tran 
    ON tk.id = tran.task 
GROUP BY tk.name, tk.priority; 

這種類型的查詢被稱爲一個支點,它就是你從取值您行並將它們轉換成行。在CASE表達式中,您只會得到每個status的總數。

+0

這就是我一直在尋找的!非常感謝您的回答! – Romulus

1
 

    select task.name, 
       task.priority , 
       count(tw.id) as waiting , 
       count(te.id) as error, 
       count(td.id) as done, 
       count(task.id) as total, 
       task.status 
     from transaction as tr 
        JOIN task 
         on task.id = tr.task 
     left JOIN task as tw 
         on (tw.id = tr.task and tr.status = 1) 
     left JOIN task as te 
         on (te.id = tr.task and tr.status = 2) 
     left JOIN task as td 
         on (td.id = tr.task and tr.status = 3) 
     group by task.id 

BY SHAHEN Babayan

+0

這個問題一年前有一個可以接受的答案,除此之外,你似乎沒有添加任何東西。 – JamesT