2015-01-13 92 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