2016-01-05 166 views
0

我有3個表COUNT()沒有DISTINCT多LEFT JOIN

orders 
----------------- 
| id | order_data | 
----------------- 

codes 
----------------------------- 
| id | code_data | order_id | 
----------------------------- 

actions (please note, in the table the primary key doesn't exists) 
-------------------------- 
| action_name | order_id | 
-------------------------- 

我怎樣才能通過順序計數動作的次數,如果行動行在表actions沒有獨特的價值,因而在DISTINCTCOUNT()沒有意義。 我的查詢:

SELECT `orders`.*, COUNT(DISTINCT `codes`.`id`), COUNT(`actions`.`action_name`) 
FROM `orders` 
LEFT JOIN `codes` ON `codes`.`id` = `orders`.`id` 
LEFT JOIN `actions` ON `actions`.`id` = `orders`.`id` 
WHERE `actions`.`action_name` IN (/*some values*/) 
GROUP BY `orders`.`id` 
+0

你爲什麼左側的接合部到動作時,你的WHERE子句呈現LEFT過時了嗎?什麼是代碼,每個訂單有多少? '如果操作行在表操作中沒有唯一值,那麼如何按順序計算操作次數,因此COUNT()中的DISTINCT沒有意義。「 < - 我很難理解這句話 – Arth

+0

我認爲內部連接會幫助你。 – Mashtani

+0

更改與和的位置。 @我認爲這是問題的關鍵。 – Strawberry

回答

0

伯爵的其它表連接,這樣前:

SELECT 
     `orders`.* 
    , IFNULL(a.CountActs, 0) CountActs 
    , IFNULL(c.CountCodes, 0) CountCodes 
FROM `orders` 
LEFT JOIN (
      SELECT `order_id`, count(*) CountCodes 
      FROM `codes` 
      GROUP BY `order_id` 
      ) c ON `orders`.`id` = c.`order_id` 
LEFT JOIN (
      SELECT `order_id`, count(*) CountActs 
      FROM `actions` 
      WHERE `actions`.`action_name` IN (/*some values*/) 
      GROUP BY `order_id` 
      ) a ON `orders`.`id` = a.`order_id` 
0
SELECT orders.* 
    , COUNT(DISTINCT c.id) 
    , COUNT(a.action_name) 
    FROM orders o 
    LEFT 
    JOIN codes c 
    ON c.id = o.id 
    LEFT 
    JOIN actions a 
    ON a.id = o.id 
    AND a.action_name IN (/*some values*/) 
GROUP 
    BY o.id 
+0

確實需要確保每個訂單不能有多個代碼,然後才能假定這可以工作。 – Arth

+0

@Arth你幾乎肯定是對的 - 但這取決於OP要計算的究竟是什麼。 – Strawberry

+0

Ty,但COUNT(a.action_name)從您的查詢返回相同的錯誤結果,就像在我的查詢中一樣。我想要計數碼數,動作數和抓取命令女巫有一些行動 – gutsout