2010-10-06 55 views
0

我有2個表mysql - php。如何找到

users : id , name 
order : id , price, user_id 

一個用戶有不止一個數量級。並且我想選擇一個用戶總價> 100的用戶

。怎麼做 ?

EX:用戶John有3個訂單,價格:$ 30,$ 40,$ 50

SELECT * FROM user u 
INNER JOIN order o ON o.user_id = u.id 
WHERE sum(o.price) >100 

此查詢會得到用戶的約翰? 30 + 40 + 50 = 110> 100 ?

回答

0
SELECT u.Id, Sum(o.price) FROM user u 
INNER JOIN order o ON o.user_id = u.id 
GROUP BY u.Id 
HAVING sum(o.price) > 100 
1

首先,您不允許在您的WHERE子句中使用聚合函數(即SUM)。它們應該在HAVING條款中使用。要計算聚合物,你需要GROUP BY東西,在你的情況下由u.id

所以:

SELECT * 
FROM user u 
INNER JOIN order o ON u.user_id = u.id 
GROUP BY u.id 
HAVING sum(o.price) > 100 

請注意,如果您需要的用戶,沒有秩序,你將不得不使用LEFT JOIN

0

感謝所有的答案,但我抓住問題 現在我有一個新的表order_file

users  : id , name 
order  : id , price, user_id 
order_file : id , file , order_id 

用戶,訂單是一對多

秩序,order_file是一對多

一用戶約翰有1個訂單與價格是200 $ 和這個訂單鏈接到order_file與兩個記錄

SELECT * 
FROM user u 
INNER JOIN order o ON u.user_id = u.id 
INNER JOIN order_file of ON of.order_id = o.id 
WHERE u.name = 'John' 

我們將在order_file

現在得到兩個rows.Only DIFF值獲得一次我使用DISTINCT,我也得到1行

SELECT DISTINCT * 
FROM user u 
INNER JOIN order o ON u.user_id = u.id 
INNER JOIN order_file of ON of.order_id = o.id 
WHERE u.name = 'John' 

當時我SUM,哦啦啦,我得到400 $,而不是$ 200

SELECT DISTINCT *, sum(o.price) 
    FROM user u 
    INNER JOIN order o ON u.user_id = u.id 
    INNER JOIN order_file of ON of.order_id = o.id 
    WHERE u.name = 'John' 

如何我可以得到extracty $ 200,不重複行:(

+0

你應該問這個作爲一個單獨的問題。如果現有的答案是好的,你應該接受其中的一個。 – 2010-12-09 12:48:32