无法使用多个子查询

时间:2017-11-21 11:01:14

标签: mysql

编辑:更好的解释 我有一个有工作的页面。作为一个想法的工作和三个技能(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;

3 个答案:

答案 0 :(得分:2)

我们希望用户具有某些级别的特定技能。例如,具有至少20级技能1和技能2至少70级的所有用户。

这是一个算法:

  1. 首先,我们必须获得技能水平。用户有几个技能等级,每个技能的平均等级是等级。
  2. 然后我们想要一个标准表(技能1/20级,技能2/70级)。
  3. 我们收集符合条件(EXISTS子句)然后
  4. 的所有用户技能等级
  5. 保持符合所有技能水平的用户(count(*) = <desired number of skills>)。
  6. 查询:

    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);

添加到您需要的任何其他标准。