2015-01-13 10 views
1

У меня есть 2 таблицы, Task и Transaction, которые выглядят следующим образом:Multiple Внутренние соединения - MySQL

задач

enter image description here

Transaction

enter image description here

Я хотел бы создайте запрос, который возвращает информацию из обеих таблиц.

Колонны: name, priority, waiting, error, done, total, status

где:

  • имя = Task.name
  • приоритет = Task.priority
  • ожидания = кол (transaction.id) где task.id = транзакции. task and transaction.status = 1
  • error = count (transaction.id) WHERE task.id = transaction.task и transaction.status = 2
  • сделано = счетчик (transaction.id) где task.id = transaction.task и transaction.status = 3
  • = общее количество (transaction.id) где task.id = transaction.task
  • состояние = задача. статус

Я попытался с INNER JOIN, но я получаю неправильный результат:

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.id и transaction.task. Во-вторых. Вы должны быть в состоянии получить каждый из общей суммы с помощью агрегатной функции с некоторой условной логикой, как выражение случая:

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; 

Этого типа запрос известен как PIVOT, это где вы берете значение из ваших строк и преобразует их в строки. Внутри выражения 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 Шагеном Бабаян

+0

Этот вопрос принял принятый ответ год назад, и ваш, кажется, ничего не добавляет в дополнение к этому. – JamesT

Смежные вопросы