如何隨機匹配2個表中的行?MySQL與2個表匹配行/隨機查詢
假設我有
Users
-----
u1
u2
u3
而且
Items
-----
i1
i2
我想隨機匹配/加入他們喜歡
Joined
------
u1 i2
u3 i1
注意的是,在最終表中的行是一個「隨機「 比賽。此外,大小是2個源表用戶和項目中較小的一個。
如何隨機匹配2個表中的行?MySQL與2個表匹配行/隨機查詢
假設我有
Users
-----
u1
u2
u3
而且
Items
-----
i1
i2
我想隨機匹配/加入他們喜歡
Joined
------
u1 i2
u3 i1
注意的是,在最終表中的行是一個「隨機「 比賽。此外,大小是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);
通過這種方法,結果集只會是最小的表的大小,並從更大的表中的某些行會被排除在外。
你可以用笛卡爾積和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}
希望這有助於
這不會阻止重複項正確嗎?我想映射獨特的行 –
你不會有這對夫妻u.id,i.id的重複,因爲笛卡爾產品將第一張表的所有行映射到第二行的所有行 –
我猜他只想要每個項目在整個結果集中一次,而不是每個用戶一次。 – rlanvin
因此,對於每個項目您正在選擇隨機用戶?或相反亦然? 「加入」項必須是唯一的嗎?那就是 - 結果是'(u1,i2),(u1,i1)'允許嗎? –
你有表中的整數主鍵嗎? – rlanvin
也許這個問題可以幫助你:http://stackoverflow.com/questions/28514736/how-to-select-a-random-row-with-a-group-by-clause –