Mysql模拟FULL OUTER JOIN

时间:2013-08-21 19:24:26

标签: mysql sql union outer-join jointable

我有2个表用户和订单,我想让用户和他的订单计数

SELECT `users`.*, `orders`.*,count(*) FROM `users` LEFT JOIN orders ON  
`users`.`id` = `orders`.`user_id` 
UNION SELECT `users`.*, `orders`.*,count(*) FROM users 
RIGHT JOIN orders ON `users`.`id` = `orders`.`user_id`

此查询选择有订单的用户和订户的订单数,但不选择没有订单的用户。

我想要的东西

user orders
John   5
Thomas 0
Mike   8

我得到了什么

user orders
John   5
Mike   8

如何获得没有订单的用户?

2 个答案:

答案 0 :(得分:3)

您不需要完整的外部联接。假设orders表中的所有用户都具有对users表的有效引用,左外连接应该没问题:

SELECT u.*, count(o.user_id)
FROM `users` u LEFT JOIN
      orders o
      ON u.`id` = o.`user_id` 
group by u.id

答案 1 :(得分:2)

以下查询将为您提供所有用户及其订单计数的列表,如果该用户没有订单,则包括0。

另外,你确定ORDER_ID是用户表的FK吗?这对我来说似乎是反直觉的......

SELECT U.NAME
        ,COUNT(O.ORDER_ID)
FROM    USERS U
LEFT OUTER JOIN
        ORDERS O
ON      U.ID = O.ORDER_ID
GROUP BY
        U.NAME