我正在尝试将两个任务合并为一个查询...并遇到麻烦。让我们假设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
答案 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;