我有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的连接结果中有足够的消息可以进行唯一随机化。
答案 0 :(得分:1)
我强烈建议你使用代码。
你希望sql解释器走两组,这很公平,但是你的查询很难理解,因此难以维护。 "硬盘"结果是:昂贵。
无论如何,你可能会走结果集,对吧?
答案 1 :(得分:1)
这可能不是最有效的方式,但它会将唯一的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;
此子查询为C中的每个0 <= j < count(C)
(按随机顺序)分配一个唯一的整数(message
):
SELECT c_rand.message, @j as ind, @j:=@j+1
FROM (SELECT * FROM C ORDER BY RAND()) as c_rand;
最终查询加入ind
上的两个子查询,为每个message
分配一个唯一的随机(A, B)
。