编辑:更好的解释 我有一个有工作的页面。作为一个想法的工作和三个技能(skill_ids)和技能要求(用户必须至少具有此技能值才能获得资格)。 我点击工作找到候选人,所以我有job_id和三个skill_ids和skill_id_requirements。所以我可以做到这一点,因为第一个答案建议加入。我发现所有具有三种技能的用户。技能保存在技能组合中。到目前为止它的工作原理我只能用于查找skill_id。 但现在我想要价值,在这里我有我的代码,我计算最终值(称为评级)。评级尊重所有给定值,但不是简单平均值或所有值的总和。这就是为什么我需要长期可怕的代码。在长期可怕的代码中,我通常会插入用户的ID。但是在这里我需要拥有上述技能的所有user_id才能计算出他们是否合格。这是动态的。
我有一张桌子,我希望找到符合某些要求的人才。在这里,我使用一个名为skill_ratings的表,但是(据我所知)需要添加一些子查询。在这里,我遇到了问题。有很多子查询,我试图解决父查询字段。但它似乎只能在父级查询的一级子查询中工作。 这是我的结构:
SELECT * FROM table t
WHERE EXISTS (SELECT * FROM table d WHERE x > 1
AND b=t.id
AND y <= (SELECT a FROM (MAIN SUBQUERY WITH CALCULATIONS)))
GROUP BY xyx
但我得到的错误是:#1054 - 未知栏&#39; skra.usr_id_get&#39;在&#39; where子句&#39; 。在这种情况下,skra是父表。
我想得到以下内容(伪sql):
SELECT all FROM table t AS x
WHERE EXISTS (
SELECT all FROM table t AS y
WHERE y.skill_id = 1
AND y.usr_id_get = t.usr_id_get
AND y.value <= (my algorithm)
)
主要子查询很重要,因为我想获得一个计算数字。在其他地方代码可以工作,因为我能够使用预定义的PHP变量来获取用户的ID。但我不能在这里这样做,因为我需要在where-clause的边界内找到用户。
我该如何解决这个问题?因为寻址子查询中的父字段似乎仅限于一级子查询。
编辑:代码
Code removed due to project status.
错误:#1054 - 未知栏&#39; c.usr_id_get&#39;在&#39; where子句&#39;
答案 0 :(得分:2)
我们希望用户具有某些级别的特定技能。例如,具有至少20级技能1和技能2至少70级的所有用户。
这是一个算法:
EXISTS
子句)然后count(*) = <desired number of skills>
)。查询:
select
sr.usr_id_get
from
(
select usr_id_get, skill_id, avg(value) as level
from skill_ratings
group by usr_id_get, skill_id
) sr
where exists
(
select *
from
(
select 1 as skill_id, 20 as level
union all
select 2 as skill_id, 70 as level
) criteria
where sr.skill_id = criteria.skill_id
and sr.level >= criteria.level
)
group by usr_id_get
having count(*) = 2;
您还可以将条件设为真实(临时)表格。无论请求了多少技能,您的查询都会保持不变。你有
where exists
(
select *
from criteria
where sr.skill_id = criteria.skill_id
and sr.level >= criteria.level
)
group by usr_id_get
having count(*) = (select count(*) from criteria);
然后
答案 1 :(得分:1)
看起来可以使用简单的JOIN
:
SELECT T.*
FROM your_table T
JOIN other_table Y ON (
T.usr_id_get = Y.usr_id_get
AND T.skill_id = 1
AND Y.value <= [...]
)
如果您需要在加入之前执行某种计算,那么您可以使用子查询加入:
SELECT T.*
FROM your_table T
JOIN (
SELECT *
FROM other_table Y
WHERE Y.skill_id = 1
AND Y.value = [...]
) Y USING(usr_id_get)
答案 2 :(得分:0)
如果我理解正确,你有一个用户,比如用户123,一个技能,比如技能99.现在你想得到用户123和技能99的平均等级,然后找到平均值相等或更好的所有用户评估该技能。
这是如何获得每位用户99技能的平均评分:
select usr_id_get, avg(value)
from skill_ratings
where skill_id = 99
group by usr_id_get;
这是如何让所有用户获得与用户123相同或更好的技能99的平均等级:
select usr_id_get
from skill_ratings
where skill_id = 99
group by usr_id_get
having avg(value) >=
(select avg(value) from skill_ratings where skill_id = 99 and usr_id_get = 123);
添加到您需要的任何其他标准。