2015-11-11 50 views
1

如何隨機匹配2個表中的行?MySQL與2個表匹配行/隨機查詢

假設我有

Users 
----- 
u1 
u2 
u3 

而且

Items 
----- 
i1 
i2 

我想隨機匹配/加入他們喜歡

Joined 
------ 
u1 i2 
u3 i1 

注意的是,在最終表中的行是一個「隨機「 比賽。此外,大小是2個源表用戶和項目中較小的一個。

+1

因此,對於每個項目您正在選擇隨機用戶?或相反亦然? 「加入」項必須是唯一的嗎?那就是 - 結果是'(u1,i2),(u1,i1)'允許嗎? –

+1

你有表中的整數主鍵嗎? – rlanvin

+0

也許這個問題可以幫助你:http://stackoverflow.com/questions/28514736/how-to-select-a-random-row-with-a-group-by-clause –

回答

2

你想加入用戶的項目的基礎上,不存在(「隨機」值,實時計算)之間的關係。

換句話說,對於每個用戶,你想選擇隨機項目。

假設有在你的主鍵序列中沒有孔,你可以寫這樣的查詢:

set @nb_items = select max(id) from items; 

select users.id, items.id 
from users 
join items on items.id = floor(1 + rand() * @nb_items); 

此查詢但不能防止一個項目被多次選擇爲不同的用戶。

所以解決這個問題的另一種方法是實現這種「隨機」關係。例如,您可以隨機對兩個表進行排序,並使用行號作爲鍵將它們結合起來。下面是該查詢,有明確的表名淨度:

set @i = 0; 
set @j = 0; 

select numbered_randomized_users.id, numbered_randomized_items.id 
from (
    select id, @i := @i + 1 as row_number 
    from (
    select id from users order by rand() 
) as randomized_users 
) as numbered_randomized_users 
join (
    select id, @j := @j + 1 as row_number 
    from (
    select id from items order by rand() 
) as randomized_items 
) as numbered_randomized_items using(row_number); 

通過這種方法,結果集只會是最小的表的大小,並從更大的表中的某些行會被排除在外。

0

你可以用笛卡爾積和ORDER BY RAND()來做到這一點。要小心,在ORDER BY語句中使用RAND()會導致MySQL執行全表掃描,因此如果行數很多,性能將會很差。

SELECT u.id, i.id FROM users as u, items as i 
ORDER BY RAND() LIMIT {smallest table size} 

希望這有助於

+0

這不會阻止重複項正確嗎?我想映射獨特的行 –

+0

你不會有這對夫妻u.id,i.id的重複,因爲笛卡爾產品將第一張表的所有行映射到第二行的所有行 –

+0

我猜他只想要每個項目在整個結果集中一次,而不是每個用戶一次。 – rlanvin