这是一个非常具体的:
我有两个表(t1
和 t2
)——t1
是我的所有人表,其中包含我数据库中的每个人以及所有他们的数据被存放,t2
是我的小得多的人员表,他们实际上将负责与 t1
中的人员交谈。
正如您在此示例中所看到的 SQL Fiddle ,t1
中的每个人都有分配给他们的特定标准(年龄、等级和团队)。我的最终结果希望是:对于 t2
中的每一位工作人员,查询将返回 t1
中的 2 个特定人员(如果他们的团队匹配)(这背后的想法是,我根据他们的团队将 t2
中的工作人员与他们将在 t1
中交谈的人员进行匹配。
但更棘手的是,我还希望查询满足另外两组条件:
- 仅返回年龄在 30 到 60 岁之间的
t1
人员(所有超出这些年龄范围的人都应被忽略)-- - 并且如果有两个以上符合上述条件的人,则首先返回评分最高的人。 (例如,如果一个团队中有四个人,而我们只需要两个人 - 因此查询应返回具有最佳评分的两个人,即接近 100 的评分。)
最后一件让我难以理解的事情是,每个团队也有多个工作人员 - 因此,如果“团队 A”中有两个 t2
工作人员,则查询应返回四个A 团队中有不同的 t1
人员:两个人隶属于一个 worker ,两个人隶属于另一个 worker (就像我上面说的,他们应该是评分最高的四个人 [尽管哪两个人去并不重要给哪个 worker )。
我希望所有团队的输出将类似于以下内容:
ID (t1) Person (t1) Team (t1) Worker (t2)
539184 Smith, Jane Team A Smith, Bob
539186 Smith, Jim Team A Smith, Bob
537141 Smith, Danny Team A Smith, Bill
537162 Smith, James Team A Smith, Bill
Etc.
实际上,我正在用数万条记录做类似的事情 - 这就是为什么这是我能想象的唯一方法,但我什至不知道从哪里开始。任何帮助将不胜感激,我将添加任何有用的其他信息!
最佳答案
SQL fiddle 不起作用。但仍然继续查询格式:)
SET @rank:=1, @curr = 0;
SELECT * FROM(
SELECT @rank := if(@curr = t1.id, @rank+1, 1 ) as rank,@curr := t1.id as curr, <field_list>
FROM t1
INNER JOIN t2 on t1.id = t2.ref_id
WHERE t2.age BETWEEN 30 AND 60 < AND "whatever">
ORDER BY t1.id, t2.ranking desc
) t WHERE rank <= 2 ;
替换为您要选择的字段,例如姓名、ID、性别 < AND "whatever"> 替换为您拥有的所有条件,例如“排名 > 10 ”等
关于mysql - 如何加入表格以返回每个团队符合特定条件的特定人数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26532774/