2012-06-12 89 views
0

總記錄我使用下面的查詢:LEFT JOIN並獲得結合表

SELECT `users`.`id` as id 
FROM (`users`) 
    LEFT JOIN `work_orders` 
     ON `users`.`id` = `work_orders`.`assigned_to` 
WHERE (work_orders.status = 'approved' 
     OR work_orders.status = 'scheduled' 
     OR work_orders.status = 'published') 
    AND work_orders.is_paid = 0 
ORDER BY `users`.`id` DESC 
LIMIT 30 

但與此查詢我越來越多條記錄每個users,如果他們有一個以上的work_orders。我應該怎麼做只列出users一次其中有多個work_orders

回答

0

您可以添加GROUP BY語句根據用戶的ID來過濾,因爲這是對一切你感興趣的

SELECT `users`.`id` as id 
FROM (`users`) LEFT JOIN `work_orders` ON `users`.`id` = `work_orders`.`assigned_to` 
WHERE (work_orders.status = 'approved' 
    OR work_orders.status = 'scheduled' 
    OR work_orders.status = 'published') 
    AND work_orders.is_paid = 0 
GROUP BY `users`.`id` 
ORDER BY `users`.`id` DESC LIMIT 30 
+0

您好,能否請您解釋一下使用不同的問題之間的差異,如由邁克和集團通過 – Yalamber

+0

我使用這個按預期工作。我想知道哪一個是更好的選擇從其他答案,因爲他們工作以及 – Yalamber

+0

如果您使用組聲明,你應該能夠計數每個用戶的條目數(以及我認爲通過使用COUNT(*)),其中可能是一個很好的擴展。另外,DISTINCT語句也應該起作用。我不確定,哪個表現更好w.r.t.性能,但不要指望有重大差異。 –

1

您可以使用DISTINCT子句:

SELECT DISTINCT(users.id) as id FROM (`users`) LEFT JOIN `work_orders` ON `users`.`id` = `work_orders`.`assigned_to` WHERE (work_orders.status = 'approved' OR work_orders.status = 'scheduled' OR work_orders.status = 'published') AND work_orders.is_paid = 0 ORDER BY `users`.`id` DESC LIMIT 30 
+0

能否請您expla在我之間使用Group by by Claas和獨特的答案之間的區別? – Yalamber

+0

那麼'GROUP BY'將允許您在每個組上運行聚合函數。但是,由於您沒有這樣做,所以'DISTINCT'似乎是更好的方法。我認爲在這種情況下,兩者在執行計劃方面會非常相似,但我不是一位mySQL專家,所以我不能肯定地說。我會使用你最喜歡的任何一個。 –

0

嘗試使用GROUP BY。

SELECT `users`.`id` as id 
    FROM (`users`) 
    LEFT JOIN `work_orders` 
    ON `users`.`id` = `work_orders`.`assigned_to` 
WHERE (work_orders.status = 'approved' 
     OR work_orders.status = 'scheduled' 
     OR work_orders.status = 'published') 
    AND work_orders.is_paid = 0 
GROUP BY `users`.`id` DESC 
LIMIT 30 
0
SELECT `users`.`id` as id 
    FROM (`users`) 
    WHERE exists (select 1 from `work_orders` where work_orders.status 
        in ('approved' ,'scheduled' ,'published') 
        AND work_orders.is_paid = 0 
        and `work_orders`.`assigned_to` =`users`.`id`) 
ORDER BY `users`.`id` DESC 
LIMIT 30 
+0

這個看起來更復雜,它可以在所有的mysql版本上工作嗎? – Yalamber