2012-08-15 54 views
3

假設我們有兩個表usersproductsQuering兩個表沒有任何關係

users有accountBalance列

users模式:

userId accountBalance ......... 
1   500  ......... 
2   45000  ......... 
3   4238827 ......... 
.    .  ......... 
.    .  ......... 
.    .  ......... 

products有價柱

products模式:

productId price  ......... 
1   40000  ......... 
2   55000  ......... 
3   90000  ......... 
.    .  ......... 
.    .  ......... 
.    .  ......... 

這些表沒有任何關係,所以我不能通過一個公共密鑰加入它們。我想知道的是找出每個用戶都可以買什麼產品,其格式與預期的結果如下:

expected result是:

userId productIdsUserAffordToBuy 
1  NUll 
2  1*2 
3  1*2*3 
.  . 
.  . 
.  . 

回答

6

使用GROUP_CONCAT()以創建單個列中的列表,對加盟條件accountBalance >= price可以實際上進行LEFT JOIN(必要爲誰買不起任何東西,而不是省略行的用戶返回NULL):

SELECT 
    userId, 
    GROUP_CONCAT(productId) AS productIdUserAffordToBuy 
FROM 
    users 
    LEFT JOIN products ON users.accountBalance >= products.price 
GROUP BY userId 
+0

Thnaks邁克爾就像一個魅力 – pouya 2012-08-15 01:46:04

5
select userid,accountbalance,group_concat(productid) as productaffordtobuy 
from users cross join products 
where price<=accountbalance 
group by userid 

SQL FIDDLE HERE>

+0

是否MySQL支持交叉連接的? – 2012-08-15 01:36:42

+1

它確實支持交叉連接。但是,如果用戶無法承擔任何費用,我將不承擔責任。因此,在這種情況下使用左連接更合適。 – sel 2012-08-15 01:39:27

+0

應該問一個更好的問題 - 你提供的是否支持mysql的交叉連接 - 上次我閱讀文檔時,支持有限 - 或者我正在考慮其他的東西 – 2012-08-15 01:40:35

1

Cross Join沒有任何關係或者id是有點棘手

select userid,accountbalance,productid as productaffordtobuy 
from users 
cross join products 
where price<=accountbalance 
group by userid