我有 3 个表:
A (id, b_id)
B (id, city)
C (message)
我需要构建一个查询:
SELECT b.city, random(unique(c.message)) from A a, B b, C c where a.b_id = b.id;
当然我这里的查询是我需要的例子。
我需要 A 和 B 连接的每一行都有一条来自 C 的随机消息。我们确信有足够的消息可以在 A 和 B 的连接结果中进行唯一随机化。
最佳答案
这可能不是最有效的方法,但它会映射一个唯一的 C.message
每(A, B)
假设 count(C) >= count(A, B)
.
SET @i:=0;
SET @J:=0;
SELECT ab_mapping.city, c_index.message
FROM (SELECT B.city, @i as ind, @i:=@i+1
FROM A JOIN B
ON A.b_id = B.id) as ab_mapping
JOIN
(SELECT c_rand.message, @j as ind, @j:=@j+1
FROM (SELECT * FROM C ORDER BY RAND()) as c_rand) as c_index
ON ab_mapping.ind = c_index.ind;
工作原理
这个子查询分配一个唯一的整数(0 <= i < count(A, B)
)给(A, B)
映射:
SELECT B.city, @i as ind, @i:=@i+1
FROM A JOIN B
ON A.b_id = B.id;
此子查询为每个 0 <= j < count(C)
分配一个唯一的整数 ( message
) (以随机顺序)在 C 中:
SELECT c_rand.message, @j as ind, @j:=@j+1
FROM (SELECT * FROM C ORDER BY RAND()) as c_rand;
最终查询在 ind
上加入两个子查询分配一个独特的随机 message
每个 (A, B)
.
关于Mysql从表中查询随机唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34096682/