两个表中由RAND()计数和排序的MySql子查询

时间:2018-01-20 06:52:47

标签: mysql nested

我正在尝试将两个任务合并为一个查询...并遇到麻烦。让我们假设2个表"用户"和"作业"每个都包含一个UserId字段。在"作业"表,可能有多行具有相同的" UserId"字段,因此它具有" UserId"之间唯一配对的键。和#34; TeammateId"。

+--------------+
+-----users----+
+--------------+
+-UserId(pk)---+
+-UserName-----+
+----(etc...)--+


+---------------+
+--assignments--+
+---------------+
+-UserId--------+
+-TeammateId----+
+----(etc...)--+

TeammateId中填充了其他可能用户的userId,目的是进行团队分组。

UserId 1 = Joe
UserId 2 = Sally
UserId 3 = Hank
UserId 4 = Wanda

我的最终目标是将赋值表填充为:

+--UserId--+--TeammateId--+
+-- 1 -----+-- 4 ---------+
+-- 1 -----+-- 2 ---------+
+-- 2 -----+-- 1 ---------+
+-- 2 -----+-- 3 ---------+
+-- 3 -----+-- 1 ---------+
+-- 3 -----+-- 4 ---------+
+-- 4 -----+-- 2 ---------+
+-- 4 -----+-- 3 ---------+

因此,团队负责人Joe被分配了2名队友,Wanda和Sally。您会注意到每个UserId都分配了两个TeammateId ...它们与UserId不同(您不能在您自己的团队中)。此外,每个TeammateId的使用次数不超过2次。 (是的,这意味着每个用户基本上有三个团队,但在每种情况下,我的初始UserId都是团队领导,并被分配了2个合作伙伴。)

我的计划是使用PHP为每个UserId运行查询以生成2个队友...然后理想情况下应该返回两个有效的随机TeammateId数字(如,不要=用户,彼此,或者已经使用过2次了。

假设我们为Wanda(用户4)运行此脚本,初始查询可能如下所示:

SELECT * FROM users WHERE `UserId` != '4' ORDER BY RAND();

这为我提供了我需要的数据(UserId,UserName和其他一些字段),用于随机排序的初始可能的队友。

我的PHP选项是一次解析这些结果,查找SELECT COUNT(队友)< 2和UserId!=' 4'一旦我找到了,那么我有一个结果......我只是第二次循环以获得第二个结果。

这要求每个查询每个用户运行3次...这样就可以了(相当小的数据集和不多的流量)...但我知道必须有一种方法可以将所有这些作为单个(可能是嵌套的查询,只需一步生成我的2个队友。

这是一个用于测试的sqlfiddle:http://sqlfiddle.com/#!9/ae736f

1 个答案:

答案 0 :(得分:0)

我想我明白了!有人能告诉我这是如何改进的吗?

SELECT * 
FROM users 
WHERE `UserId` != '4' 
AND `UserId` NOT IN 

(  SELECT `TeammateId`
FROM `assignments`
GROUP BY `TeammateId`
HAVING COUNT(*) >= 2  ) 

ORDER BY RAND() LIMIT 2;