Mysql从表中查询随机唯一值

时间:2015-12-04 20:13:34

标签: mysql

我有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的连接结果中有足够的消息可以进行唯一随机化。

2 个答案:

答案 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)