【问题标题】:Getting unknown column error when selecting data for a derived table为派生表选择数据时出现未知列错误
【发布时间】:2019-06-23 16:49:46
【问题描述】:

我需要一个查询来创建一个表来计算给定字段中每个值的数量,但由于这个表中的数据不足,我不得不加入另一个表以获得一个额外的值 (NName):

Records_table--------------       Name_table---------
Ref    Score     Iteration        Ref      NName
1      High      1                1        Falcon
1      Middle    2                2        Willow
2      Middle    1                3        Lance
2      Middle    2                4        Ranger
2      Low       3
3      Low       1
4      High      1
4      High      2
4      High      3

需要输出:

NName      High  Middle  Low
Falcon     1     1       0
Willow     0     2       1
Lance      0     0       1
Ranger     3     0       0

这就是我所拥有的: (编辑,因为我注意到我在我的版本中删除了一个 SELECT 字段(“Ref”))

SELECT 
    tc.nname AS NName, 
    COUNT(High) High,
    COUNT(Middle) Middle,
    COUNT(Low) Low
FROM
    (SELECT 
        NName, 'High' High, NULL Middle, NULL Low
    FROM
        records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
    WHERE
        tr.score = 'High'
    UNION ALL 
    SELECT 
       NName, NULL, 'Middle', NULL
   FROM
       records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
   WHERE
       tr.score = 'Middle'
    UNION ALL
    SELECT 
       NName, NULL, NULL, 'Low'
   FROM
       records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
   WHERE
       tr.score = 'Low' ) T 
GROUP BY NName;

这失败了,出现“错误 1054 (42S22):‘字段列表’中的未知列‘NName’”

我做错了什么,我需要做什么才能完成这项工作?

【问题讨论】:

  • 您能否执行内部SELECT(即带有联合的那个)并查看您在输出中看到的列名是什么?
  • 我想我会使用条件聚合以不同的方式做到这一点。
  • @Darshan Mehta,我只执行了第一个,因为我在开始时不再有 select 语句,我不得不用“NName”代替字段名称“tc.Nname”,这个工作。但是,当我再次运行整体时,它仍然失败:
  • SELECT tc.nname AS NName, COUNT(High) High, COUNT(Middle) Middle, COUNT(Low) Low FROM (SELECT tc.nname, 'High' High, NULL Middle, NULL Low FROM records_table tr JOIN name_table tc ON tc.ref = tr.ref WHERE tr.score = 'High' UNION ALL....... WHERE tr.score = 'Low' ) T GROUP BY tc.nname;错误 1054 (42S22):“字段列表”中的未知列“cases.project”
  • @P Salmon,你是个明星,辛苦了,将在下面发布完整的解决方案,谢谢。

标签: mysql subquery derived-table


【解决方案1】:

虽然不严格地问问题是什么(这是一个封闭的问题,@scaisEdge 给出了正确的答案)我不认为联合是最好的方法。考虑条件聚合

select n.ref,n.nname,
          sum(case when score = 'high' then 1 else 0 end) High,
          sum(case when score = 'middle' then 1 else 0 end) middle,
          sum(case when score = 'low' then 1 else 0 end) low
from n 
join r on r.ref = n.ref
group by n.ref,n.nname;

+------+--------+------+--------+------+
| ref  | nname  | High | middle | low  |
+------+--------+------+--------+------+
|    1 | Falcon |    1 |      1 |    0 |
|    2 | Willow |    0 |      2 |    1 |
|    3 | Lance  |    0 |      0 |    1 |
|    4 | Ranger |    3 |      0 |    0 |
+------+--------+------+--------+------+
4 rows in set (0.00 sec)

【讨论】:

  • 谢谢你——在你上面的问题的提示下,我得出了同样的结论(使用 COUNT 而不是 SUM,但本质上是一样的)——非常感谢!
【解决方案2】:

你的表别名是 T 而不是 tc 那么你应该在主选择中使用 T.nname

    SELECT 
            T.`NNAME` AS NName, 
            COUNT(High) High,
            COUNT(Middle) Middle,
            COUNT(Low) Low
    FROM  ( 
        SELECT 
                Ref,`NNAME`, 'High' High, NULL Middle, NULL Low
        FROM  records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
        WHERE tr.score = 'High'
        UNION ALL 
        SELECT 
               Ref,`NNAME`, NULL, 'Middle', NULL
        FROM records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
        WHERE tr.score = 'Middle'
        UNION ALL
        SELECT 
               Ref,`NNAME`, NULL, NULL, 'Low'
        FROM records_table tr
        JOIN name_table tc ON tc.ref = tr.ref
        WHERE tr.score = 'Low' 
    ) T 
    GROUP BY T.`NNAME`;

【讨论】:

  • 可能是您的查询中有一些垃圾字符尝试重新输入与 NNAME 相关的代码.. 删除逗号之间的所有字符或用 bactiks 包装 colname ..
猜你喜欢
  • 1970-01-01
  • 2014-02-17
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多