2011-08-18 65 views
0

我會盡量簡化。幫助與mysql連接/分組

此查詢列出了我的網站用戶,他們的總訂單,卡片和文件中的地址。

由於某些原因,如果用戶有2個地址,但只有1個訂單,它會顯示客戶有2個訂單。

例如:user4實際上只有1個訂單,但顯示2,我假設它,因爲他有2個地址,它與連接或分組有關。

SELECT 
users.user_email, 
users.user_firstname, 
users.user_lastname, 
users.user_joindate, 
users.user_logindate, 
Count(users_addresses.usera_id) AS count_addr, 
Count(users_cards.userc_id) AS count_cards, 
Count(orders.order_id) AS count_orders, 
Sum(orders.order_total) AS sum_ordertotal 
FROM 
users 
LEFT JOIN users_addresses ON users_addresses.usera_userid = users.user_id 
LEFT JOIN users_cards ON users_cards.userc_userid = users.user_id 
LEFT JOIN orders ON orders.order_userid = users.user_id 
GROUP BY 
users.user_id 
ORDER BY user_id DESC 
LIMIT 5 

實施例輸出中:

userid | orders | addresses | cards 
------ ---------------------------- 
user4 | 2 |  2  | 0 
user3 | 0 |  0  | 0 
user2 | 1 |  1  | 0 
user1 | 0 |  1  | 0 

回答

1

一種可能性是使用COUNT(DISTINCT orders.order_id)。但是,這對Sum()沒有幫助。

另一種可能性(albiet效率較低)是對子計數使用子查詢。

SELECT 
    users.user_email, 
    users.user_firstname, 
    users.user_lastname, 
    users.user_joindate, 
    users.user_logindate, 
    (SELECT count(*) FROM users_addresses WHERE users_addresses.usera_id = users.user_id) AS count_addr, 
    (SELECT count(*) FROM user_cards WHERE users_cards.userc_id = users.user_id) AS count_cards, 
    Count(orders.order_id) AS count_orders, 
    Sum(orders.order_total) AS sum_ordertotal 
FROM users 
LEFT JOIN orders ON orders.order_userid = users.user_id 
GROUP BY users.user_id 
ORDER BY user_id DESC 
LIMIT 5 
+0

DISTINCT供職的數量和它*似乎*它的工作的總和爲好。謝謝! – tuurbo

+0

我檢查並檢查了兩次,當我添加DISTINCT到它的工作時間以及。 – tuurbo

+0

請注意,您希望在count(distinct)中使用表的不同鍵 - 看起來您使用的是user_id,它總是會返回1的計數。另外,在SUM()內使用'distinct'可能看起來像去工作,但它實際上只是加總不同的金額。如果您有兩筆相同金額的訂單(針對同一用戶),則無法正確計數。 –

0

至於建議之前:

count(distinct(orders.order_id)) as count_orders 

而且你可以使用:

(select sum(order_total) from orders where user_id = users.user_id) as sum_ordertotal