【发布时间】:2012-01-05 21:06:18
【问题描述】:
从一列唯一(非重复)值中选择一对非先前选择的不同随机值的最有效方法是什么?
我目前的方法是(将已经关联的每对值保存在单独的“mytable_associations”表中):
SELECT * FROM
(
SELECT id,count(*) AS associations_count FROM mytable
INNER JOIN mytable_associations
WHERE (myvalue=myvalue1 OR myvalue=myvalue2)
GROUP BY myvalue
HAVING associations_count<(SELECT count(*) FROM mytable)-1
ORDER BY rand() limit 1
) mytable1
LEFT JOIN
(SELECT myvalue AS myvalue2 FROM mytable) mytable2
ON mytable1.myvalue1<>mytable2.myvalue2
WHERE
(
SELECT myvalue1 FROM mytable_associations
WHERE
myvalue1=mytable1.myvalue1 AND myvalue2=mytable2.myvalue2
OR
myvalue1=mytable2.myvalue2 AND myvalue2=mytable1.myvalue1
) IS NULL;
(当然,然后用这个新关联更新 mytable_associations)
如您所见,这可以极大地受益于一些优化。
(抱歉代码缩进不好,我真的不知道mysql命令如何缩进)。
你能帮帮我吗?
(P.S. 这是我在这里发布的第一个问题:当然,我做错了很多事情,我会理解随之而来的燃烧,但请不要对我太苛刻;))
【问题讨论】:
-
理解您的查询似乎有点棘手。您是否介意对其进行一些深入了解,例如解释查询的不同部分以及它们的作用?如果你能给出一个你想要实现什么的虚拟例子,那就太好了
-
基本上它是两个部分:首先我选择一个尚未相互耦合的值。我通过 SELECT RANDOM FROM mytable WHERE (SELECT number of associations for each value FROM associates_table)
-
刚刚进行了更新以减少代码混乱。希望它现在更具可读性,但无论如何看看下面 Bill Karwin 的解决方案,这正是我想要的